Oracle PLSQL触发器或任何其他维护insert语句主要条件的方法
我需要你帮我拿扳机之类的东西 问题是: 我有一个以“id”作为主键的表。 我从第三方应用程序获取的文件只包含表的insert语句(文件生成定期进行)。 当我执行文件时(文件包含新ID和现有ID), a) 应将记录插入到新ID的表中Oracle PLSQL触发器或任何其他维护insert语句主要条件的方法,oracle,plsql,primary-key,database-trigger,Oracle,Plsql,Primary Key,Database Trigger,我需要你帮我拿扳机之类的东西 问题是: 我有一个以“id”作为主键的表。 我从第三方应用程序获取的文件只包含表的insert语句(文件生成定期进行)。 当我执行文件时(文件包含新ID和现有ID), a) 应将记录插入到新ID的表中 b) 应该对现有ID执行删除插入或更新,因此,您有一个脚本,其中包含insert语句,但只应插入新数据,并且更新应“升级” 立即的响应是将INSERT语句替换为MERGE语句,这可能使用sed+awk实现,但不需要查看我们不知道的脚本和表格式 或者另一种方法是对脚本中
b) 应该对现有ID执行删除插入或更新,因此,您有一个脚本,其中包含
insert
语句,但只应插入新数据,并且更新应“升级”
立即的响应是将INSERT语句替换为MERGE
语句,这可能使用sed+awk
实现,但不需要查看我们不知道的脚本和表格式
或者另一种方法是对脚本中的ID
值执行grep
,并在INSERT
s之前为这些值生成DELETE
s块
同样,如果没有脚本中的代码示例,我无法给出任何关于如何执行此操作的代码
假设您的表被称为the\u app\u table
,则更详细的方法可能如下所示:
-- CREATE A table based on INSERT target
CREATE TABLE the_temp_table AS SELECT * FROM the_table WHERE 1 = 2;
现在使用该文件将目标名称更改为临时表:
sed's/the_target_table/the_temp_table/'the_script.sql>the_new_script.sql
运行此新脚本,将数据插入临时表
编写一个
MERGE
语句,从临时表
向应用表
上插入。首选方法是将insert语句更改为语句。但是,当您说“我从第三方应用程序中获取…”时,我假设您无法更改它们
在这种情况下,从您的表创建一个视图,即一个简单的create视图。。。从您的_表中选择*代码>
例如,您可以创建ab
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;
从这个表和INSTEAD OF触发器创建一个视图,因此我需要将SQL insert语句文件更改为指向视图而不是表。我说得对吗?