Oracle 合并而不是插入?

5 sql oracle perl dbi oracle11g

我目前在使用DBI收集路由器接口数据的模块的 perl 脚本中有一个插入语句。它每次都有效,但显然存在唯一约束错误,因为重新运行脚本时存在某些项目。我正在尝试进行合并,但我不确定如何通过不从另一个表中选择数据(如我所见的示例)来进行合并。为了更好地理解,perl 脚本通过运行ssh到设备来收集数据,并将某些信息存储到变量中。例如接口名称将是$interface. 等等。

当前插入语句

$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);
Run Code Online (Sandbox Code Playgroud)

我开始编写合并功能,但我似乎无法理解这是如何工作的,因为所有合并语句都从其他表和匹配数据中进行选择,然后进行更新/插入?下面的示例从 2 个不同的表中选择数据并进行匹配,但是我只查看一个表并希望合并新数据。

MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
 VALUES (S.employee_id, S.salary*.01)
 WHERE (S.salary <= 8000); 
Run Code Online (Sandbox Code Playgroud)

因此,它正在将数据合并到bonuses员工中,但与之匹配。即使这样的语句会起作用,甚至可以在 perl 脚本中使用这样的语句吗?

Kau*_*yak 5

在你的情况下,这样的 MERGE声明应该有效。请注意,我正在从DUAL表中选择一条记录。您可以将多个UNION ALLs fromDUAL用于多行。

MERGE INTO yourtable target
     USING (SELECT 1 AS id, 'value_1' AS column_1, 'value_2' AS column_2
              FROM DUAL) source
        ON (source.id = target.id)
WHEN MATCHED
THEN
   UPDATE SET
      target.column_1 = source.column_1, target.column_2 = source.column_2
WHEN NOT MATCHED
THEN
   INSERT     (column_1, column_2)
       VALUES (source.column_1, source.column_2);
Run Code Online (Sandbox Code Playgroud)