触发器oracle

时间:2016-04-06 17:37:55

标签: oracle triggers

我在视图上创建了一个INSTEAD OF INSERT触发器(见下文),以便在基础表中插入一行。由于某些应用程序限制,我们需要继续执行此路由。

      1  CREATE OR REPLACE TRIGGER trigger_INSERT3 INSTEAD OF INSERT ON    ISG_SESSION_TEMPFEB15_VIEW REFERENCING NEW AS n FOR EACH ROW
      2  DECLARE
      3         IsgSession ISG_SESSION_TEMPFEB15%rowtype;
      4         row_count number;
      5         fldtime ISG_SESSION_TEMPFEB15.fld_timestamp%type;
      6         isgstart timestamp(6);
      7         isgstop timestamp(6);
      8  BEGIN
      9         select count(*) into row_count FROM  ISG_SESSION_TEMPFEB15
     10         WHERE isg_session_id = :n.isg_session_id
     11         AND nas_ip = :n.nas_ip
     12         AND mac_address = :n.mac_address;
     13  dbms_output.put_line('the value of row_count is '||ROW_COUNT);
     14  IF row_count IS NULL then
     15                fldtime:=to_timestamp_tz(:n.FLD_TIMESTAMP_TEMP,'RRRR-MM-DD"T"hh24:mi.SSXFFTZR') ;
     16                isgstart:=to_timestamp_tz(:n.ISG_START_TIME_TEMP,'RRRR-MM-DD"T"hh24:mi.SSXFFTZR') ;
     17                isgstop:=to_timestamp_tz(:n.ISG_STOP_TIME_TEMP,'RRRR-MM-DD"T"hh24:mi.SSXFFTZR') ;
     18  end if ;
     19  dbms_output.put_line('the values of fldtime,isgstart,isgstop are '||fldtime||','||isgstart||','||isgstop);
     20* end;
     21  /

   Trigger created.

    SQL> set serveroutput on
    SQL> insert into sanpalle.ISG_SESSION_TEMPFEB15_view(ISG_SESSION_ID,MAC_ADDRESS,NAS_IP,FLD_TIMESTAMP_TEMP,created_dte,isg_stop_time_temp) values 
      2    ('7000','7001','7002','2016-04-06T12:41:59.200Z','06-Apr-16 10.05.00.000000','2016-04-06T10:12:59.200Z');
   the value of row_count is 0
  the values of fldtime,isgstart,isgstop are ,,

  1 row created.

  SQL> 

问题是1)变量的值(fldtime,isgstart,isgstop)显示为NULL 2)即使它说“创建了1行”,实际上也没有插入行。 有人可以告诉我哪里出错了吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

ad 2)如果您使用“insted of trigger”插入VIEW,则需要在此触发器中插入子句到某个表。

insert into my_table(a,b,c) values(:n.a, :n.b, :n.c);

(我没有看到提交,也许你有自动提交 - 我不知道)

ad 1)条件

IF row_count IS NULL then 

为false,bacause null不为0, 如果你有选择计数(*)然后将有每个数字,然后使用条件:

IF (row_count = 0) then
  • 1 = null = false
  • 1!= null = false
  • 0 = null = false
  • null is null = true

条件中的空值只需要运算符是/不是,不能用其他任何东西