Oracle合并而不是插入?

时间:2018-02-23 07:15:59

标签: sql oracle perl oracle11g dbi

我目前在perl脚本中使用收集路由器接口数据的DBI模块有一个insert语句。它每次都有效,但很明显会出现Unique约束错误,因为重新运行脚本时会出现一些项目。我试图进行合并,但我不确定如何通过不从我看到的例子中选择另一个表中的数据来做到这一点。为了更好地理解,perl脚本通过向设备运行ssh来收集数据,并将某些信息存储到变量中。例如,接口名称为$interface。等

当前插入声明

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

我开始编写合并功能,但我似乎无法理解这将如何工作,因为所有合并语句都会从其他表中选择并匹配数据,然后进行更新/插入?下面的示例从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); 

因此,它将数据合并到bonuses,但与员工进行匹配。即使这样的声明有效,是否甚至可以在perl脚本中使用这样的声明?

1 个答案:

答案 0 :(得分:3)

在您的情况下,像这样的MERGE语句应该有效。请注意,我从DUAL表中选择了一条记录。您可以将UNION ALL中的多个DUAL用于多行。

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