Oracle合并操作替代插入操作?

5
我目前在一个使用DBI模块的Perl脚本中有一个插入语句,用于收集路由器接口数据。每次都能正常运行,但显然会因为某些项目已存在而出现唯一约束错误,当脚本重新运行时。我尝试使用合并语句代替,但不像我看到的示例那样从另一个表中选择数据。为了更好地理解,Perl脚本通过运行ssh到设备并将某些信息存储到变量中来收集数据。例如,接口名称将是$interface等。
当前的插入语句
$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);

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

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); 

因此,它将数据合并到bonuses中,但是从员工匹配。即使这样的语句可以工作,使用这样的语句在Perl脚本中是否可能?

1个回答

5
在您的情况下,像这样的MERGE语句应该可以工作。请注意,我从DUAL表中选择了一条记录。您可以使用多个UNION ALLDUAL获取多行记录。
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);

非常感谢您的帮助,现在我完全明白了。 - user8956060

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接