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