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 脚本中使用这样的语句吗?
在你的情况下,这样的 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)
| 归档时间: |
|
| 查看次数: |
2980 次 |
| 最近记录: |