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触发器,后跟insert_Oracle_Triggers - Fatal编程技术网

特定字段更新后的oracle触发器,后跟insert

特定字段更新后的oracle触发器,后跟insert,oracle,triggers,Oracle,Triggers,我正在创建一个触发器,该触发器将根据更新后的记录和更新中引用的某些文本将记录插入另一个表中 CREATE OR REPLACE TRIGGER NCATSPROD_PM.DEACTIVATE_USERS AFTER UPDATE OF "CHANGEBY_CHAR" ON NCATSPROD_PM.PM_USER_DATA REFERENCING NEW AS "BICSUPP" BEGIN INSERT INTO NCATSPROD_PM.DEACTIVATED_USERS (USER

我正在创建一个触发器,该触发器将根据更新后的记录和更新中引用的某些文本将记录插入另一个表中

CREATE OR REPLACE TRIGGER NCATSPROD_PM.DEACTIVATE_USERS 
AFTER UPDATE OF "CHANGEBY_CHAR" ON NCATSPROD_PM.PM_USER_DATA 
REFERENCING NEW AS "BICSUPP"
BEGIN
  INSERT INTO NCATSPROD_PM.DEACTIVATED_USERS (USERNAME, EMAIL, DEACTIVATED_DATE) 
     VALUES (SELECT USER_ID, EMAIL, CHANGE_DATE FROM ncatsprod_pm.pm_user_data);
END;
当我试图编译这个时,我得到了一个错误

Error(1,3): PL/SQL: SQL Statement ignored
Error(1,90): PL/SQL: ORA-00936: missing expression

有点不确定我在这方面哪里出了问题?关于错误的“转到源代码”将我带到“更新后”行,但查看示例,我看不出有什么问题。我尝试使用SQL Developer的触发器向导,得到了相同的结果

引用子句仅用于更改内置旧记录和新记录的名称。OLD包含行更新前的值,NEW保存行更新后的值。下面是一个您可以如何使用它们的示例

create table PM_USER_DATA (user_id varchar2(20), email varchar2(20), change_date date, changeby_char varchar2(20));
create table DEACTIVATED_USERS (username varchar2(20), email varchar2(20), deactivated_date date);

insert into pm_user_data values ('test', 'test@test.com', sysdate, 'SOMEUSER');

create or replace trigger deactivate_users
    after update of changeby_char on pm_user_data
    referencing old as o1 new as n1
    for each row
begin
    if :n1.changeby_char = 'BICSUPP' then
        insert into deactivated_users (username, email, deactivated_date)
            values (:n1.user_id, :n1.email, :n1.change_date);
    end if;
end;
/

update pm_user_data set changeby_char = 'BICSUPP';

select * from deactivated_users;   
/* output: 
USERNAME             EMAIL                DEACTIVATED_DATE
-------------------- -------------------- ----------------
test                 test@test.com        10-OCT-17       
1 row selected.
*/

首先您应该在insert语句中使用values子句或select语句,而不是两者都使用。valuesselect在语义上不正确。其次。从表中选择触发器内部定义的触发器将导致表错误的变化。您有一个引用子句。这仅对行触发器有效。但是您缺少FOR EACH ROW表达式。正如Nicholas指出的,还有其他错误,但缺少的表达式可能指的是每行缺少的内容。@NicholasKrasnov-好的,我刚刚测试过,你是对的:只会忽略引用子句而不包含每行的内容。即使使用了别名,抛出的错误也是不同的:解析器会抱怨别名,将其视为未知标识符,因为引用子句被忽略。当然,OP确实需要一个行触发器,因此会出现其他问题,因为缺少每一行,但原始post中的错误是由其他原因造成的。我删除了值,只是选择了。那很好。做了一点测试,它并没有插入作为BICSUPP的CHANGEBY_CHAR的单个记录,而是插入源表中的所有内容。我认为使用引用new只会将匹配值BICSUPP的记录放入触发器插入?您能解释一下您所说的。。。以及更新中引用的某些文本?