Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle PLSQL触发器或任何其他维护insert语句主要条件的方法_Oracle_Plsql_Primary Key_Database Trigger - Fatal编程技术网

Oracle PLSQL触发器或任何其他维护insert语句主要条件的方法

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实现,但不需要查看我们不知道的脚本和表格式 或者另一种方法是对脚本中

我需要你帮我拿扳机之类的东西

问题是:

我有一个以“id”作为主键的表。 我从第三方应用程序获取的文件只包含表的insert语句(文件生成定期进行)。 当我执行文件时(文件包含新ID和现有ID), a) 应将记录插入到新ID的表中
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语句文件更改为指向视图而不是表。我说得对吗?