我在视图上创建了一个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行”,实际上也没有插入行。 有人可以告诉我哪里出错了吗?提前谢谢。
答案 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
条件中的空值只需要运算符是/不是,不能用其他任何东西