PLSQL触发器或任何其他方式来维护插入语句的主要条件

时间:2019-04-29 11:16:10

标签: oracle plsql primary-key database-trigger

我需要触发器的帮助或类似的东西。

问题是:

我有一个以“ id”为主键的表。 我从第三方应用程序获得的文件仅包含对该表的插入语句(文件生成是定期进行的)。 当我执行文件(文件包含新ID和现有ID)时, a)记录应插入表以获取新ID b)应该对现有ID进行删除插入或更新

2 个答案:

答案 0 :(得分:1)

首选方法是将insert语句更改为MERGE语句。但是,当您说“ 我从第三方应用程序获得的... ”时,我认为您无法更改它们。

在这种情况下,请从您的表中创建一个视图,即简单的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;

答案 1 :(得分:0)

因此,您有一个包含INSERT语句的脚本,但是只应插入新数据,而应“更新”更新。

立即的响应是将MERGE语句替换为INSERT语句,这可以使用sed + awk来实现,但是看不到我们不知道的脚本和表格格式。

或者另一种方法是对脚本中的grep值进行ID,并在DELETE之前为这些INSERT生成一个块。 / p>

同样,没有脚本中的代码示例,我无法给出任何有关如何执行此操作的代码。

假设您的表名为the_app_table,则可能会采用以下更为精细的方法:

-- CREATE A table based on INSERT target

CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;

现在将文件sed更改为临时表的目标名称:

sed 's/the_target_table/the_temp_table/' the_script.sql > the_new_script.sql

运行此新脚本,它将把数据插入到临时表中。

MERGEthe_temp_table向UPSERT写一条the_app_table语句。