触发编译但不插入行

时间:2019-08-16 22:55:56

标签: sql oracle plsql database-trigger

我正在尝试创建一个触发器,该触发器在触发时将数据插入到另一个具有USER和SYSDATE数据的表中。脚本但未从TRIGGER插入任何数据。

我正在运行Oracle Server。

 SET SERVEROUTPUT ON;

  CREATE TABLE dept1
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20)
 );

 CREATE TABLE dept1_shadow
 ( DEPTNO NUMBER(3) PRIMARY KEY,
  DNAME VARCHAR2(20),
  LOC VARCHAR2(20),
  USER_ VARCHAR2(32),
  MODTIME CHAR(17)
  );

 INSERT INTO dept1 VALUES (10, 'ACCOUNTING', 'NEW YORK');    
 INSERT INTO dept1 VALUES (20, 'RESEARCH',   'DALLAS');    
 INSERT INTO dept1 VALUES (30, 'SALES',      'CHICAGO');   
 INSERT INTO dept1  VALUES (40, 'OPERATIONS', 'WASHINGTON (D.C.)');    
 INSERT INTO dept1  VALUES (50, 'MARKETING', 'BOSTON');


CREATE OR REPLACE TRIGGER row_dept1_trigger
 AFTER INSERT ON dept1

 FOR EACH ROW

 DECLARE

 MODTIME CHAR(17);
 USER_ VARCHAR2(32);

 BEGIN

 MODTIME := TO_CHAR(SYSDATE);
 USER_ := User;

 IF INSERTING THEN
 INSERT INTO dept1_shadow (deptno, dname,loc, user_, modtime)
 VALUES (:new.deptno, :new.dname,:new.loc,user_, modtime);
 END IF;

 END;
 /

我没有任何错误。

2 个答案:

答案 0 :(得分:6)

在创建触发器之后,在 之后移动插入语句。

答案 1 :(得分:2)

可能性,没有提交。如果按布局顺序运行,则会在触发器存在之前完成插入操作。可能性,没有提交。
几个建议:

  1. 将modtime的定义更改为DATE。将日期存储为字符串最终会导致问题。
  2. 删除两个局部变量,仅在values子句中使用USER和SYSDATE。
  3. 最后删除IF INSERTING语句。您已经定义了AFTER INSERT触发器,因此if语句将始终为true。

结果:

create or replace trigger row_dept1_trigger
   after insert on dept1
   for each row
 begin
    insert into dept1_shadow (deptno, dname,loc, user_, modtime)
         values (:new.deptno, :new.dname,:new.loc,user, sysdate);
 end;