[英]Oracle merge instead of insert?
我目前在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腳本中使用這樣的聲明嗎?
在您的情況下,像這樣的MERGE
語句應該有效。 請注意,我從DUAL
表中選擇一條記錄。 您可以使用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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.