Oracle 合并而不是插入?
Oracle merge instead of insert?
我目前在使用收集路由器接口数据的 DBI
模块的 perl 脚本中有一个插入语句。它每次都有效,但显然存在唯一约束错误,因为脚本重新 运行 时存在某些项目。我正在尝试进行合并,但我不确定如何通过不 selecting 来自另一个 table 的数据来做到这一点,就像我看到的例子一样。为了更好地理解,perl 脚本通过 运行ning ssh
向设备收集数据并将某些信息存储到变量中。例如接口名称将是 $interface
。等等
当前插入语句
$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);
我开始编写合并函数,但我似乎无法理解这将如何工作,因为所有合并语句都从其他 table 和匹配数据中执行 select 然后执行 update/insert?下面的示例 selects 数据来自 2 个不同的 tables 和匹配,但是我只查看一个 table 并想合并新数据。
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 脚本中使用这样的语句?
对于您的情况,像这样的 MERGE
语句应该有效。请注意,我从 DUAL
table 中选择了一条记录。您可以将 DUAL
中的多个 UNION ALL
用于多行。
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);
我目前在使用收集路由器接口数据的 DBI
模块的 perl 脚本中有一个插入语句。它每次都有效,但显然存在唯一约束错误,因为脚本重新 运行 时存在某些项目。我正在尝试进行合并,但我不确定如何通过不 selecting 来自另一个 table 的数据来做到这一点,就像我看到的例子一样。为了更好地理解,perl 脚本通过 运行ning ssh
向设备收集数据并将某些信息存储到变量中。例如接口名称将是 $interface
。等等
当前插入语句
$dbh->do("INSERT INTO table VALUES (?, ?, ?, ?, ?)", undef, $interface, $id, $device, $description, $user);
我开始编写合并函数,但我似乎无法理解这将如何工作,因为所有合并语句都从其他 table 和匹配数据中执行 select 然后执行 update/insert?下面的示例 selects 数据来自 2 个不同的 tables 和匹配,但是我只查看一个 table 并想合并新数据。
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 脚本中使用这样的语句?
对于您的情况,像这样的 MERGE
语句应该有效。请注意,我从 DUAL
table 中选择了一条记录。您可以将 DUAL
中的多个 UNION ALL
用于多行。
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);