PLSQL 触发器或任何其他方式来维护插入语句的主要条件
PLSQL trigger or any other way to maintain primary criteria for insert statements
我需要触发器或类似的帮助。
问题是:
我有一个 table,其中 "id" 作为主键。
我从第三方应用程序获得的文件仅包含对 table 的插入语句(文件生成定期发生)。
当我执行文件时(文件包含新的和现有的 ID),
a) 应将记录插入到 table 以获取新 ID
b) 应该对现有 ID 进行删除插入或更新
因此,您有一个包含 INSERT
语句的脚本,但应该只插入新数据,更新应该是 'upserted'.
立即的反应是用 MERGE
语句替换 INSERT 语句,这可能使用 sed + awk
但没有看到我们不知道的脚本和 table 格式。
或者另一种方法是 grep
用于脚本中的 ID
值,并在 INSERT
之前为这些值生成一个 DELETE
块.
同样,如果没有您脚本中的代码示例,我无法提供有关您如何执行此操作的任何代码。
假设你的 table 被称为 the_app_table
:
-- CREATE A table based on INSERT target
CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;
现在 sed 文件以将目标名称更改为临时 table:
sed 's/the_target_table/the_temp_table/' the_script.sql > the_new_script.sql
运行 这个新脚本,它将把数据插入临时 table。
将单个 MERGE
语句写入 UPSERT 从 the_temp_table
到 the_app_table
。
首选方法是将插入语句更改为 MERGE 语句。但是,当您说“我从第三方应用程序获得...”时,我认为您无法更改它们。
在这种情况下,从您的 table 创建一个视图,即一个简单的 CREATE VIEW ... AS SELECT * FROM YOUR_TABLE;
然后你可以创建一个INSTEAD OF Trigger,例如
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE OR INSERT OR DELETE ON ...
BEGIN
IF INSERTING THEN
MERGE INTO ... D
USING (SELECT :new.ID, :new.x, :new.Y, :new.Z FROM dual) S
ON (D.ID = S.ID)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;
ELSIF DELETING THEN
NULL; -- do nothing for delete
ELSIF UPDATING THEN
UPDATE ... SET ...
WHERE ID = :OLD.ID;
END;
我需要触发器或类似的帮助。
问题是:
我有一个 table,其中 "id" 作为主键。 我从第三方应用程序获得的文件仅包含对 table 的插入语句(文件生成定期发生)。 当我执行文件时(文件包含新的和现有的 ID), a) 应将记录插入到 table 以获取新 ID b) 应该对现有 ID 进行删除插入或更新
因此,您有一个包含 INSERT
语句的脚本,但应该只插入新数据,更新应该是 'upserted'.
立即的反应是用 MERGE
语句替换 INSERT 语句,这可能使用 sed + awk
但没有看到我们不知道的脚本和 table 格式。
或者另一种方法是 grep
用于脚本中的 ID
值,并在 INSERT
之前为这些值生成一个 DELETE
块.
同样,如果没有您脚本中的代码示例,我无法提供有关您如何执行此操作的任何代码。
假设你的 table 被称为 the_app_table
:
-- CREATE A table based on INSERT target
CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;
现在 sed 文件以将目标名称更改为临时 table:
sed 's/the_target_table/the_temp_table/' the_script.sql > the_new_script.sql
运行 这个新脚本,它将把数据插入临时 table。
将单个 MERGE
语句写入 UPSERT 从 the_temp_table
到 the_app_table
。
首选方法是将插入语句更改为 MERGE 语句。但是,当您说“我从第三方应用程序获得...”时,我认为您无法更改它们。
在这种情况下,从您的 table 创建一个视图,即一个简单的 CREATE VIEW ... AS SELECT * FROM YOUR_TABLE;
然后你可以创建一个INSTEAD OF Trigger,例如
CREATE OR REPLACE TRIGGER update_name_view_trigger
INSTEAD OF UPDATE OR INSERT OR DELETE ON ...
BEGIN
IF INSERTING THEN
MERGE INTO ... D
USING (SELECT :new.ID, :new.x, :new.Y, :new.Z FROM dual) S
ON (D.ID = S.ID)
WHEN MATCHED THEN UPDATE SET ...
WHEN NOT MATCHED THEN INSERT ...;
ELSIF DELETING THEN
NULL; -- do nothing for delete
ELSIF UPDATING THEN
UPDATE ... SET ...
WHERE ID = :OLD.ID;
END;