2016-04-06 31 views
0

我在視圖上創建了INSTEAD OF INSERT觸發器(請參閱下文),以在基礎表中插入一行。由於某些應用程序的限制,我們需要繼續此路線。觸發器中綁定變量的值oracle

 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

正如您在輸出中看到的那樣,row_count的值爲零,因爲select與任何記錄都不匹配。此外,您正在檢查row_count是否爲null,而不是row_count爲零。所以沒有達到賦予fldtime,isgstart,isgstor的代碼 – cableload

+0

另外,我沒有看到任何插入語句在你的觸發器中插入新行。 – cableload

+0

@cableload - 把row_count = 0解決了這個問題。非常感謝你 – newbee

回答

1

ad 2)如果你用「insted of trigger」插入VIEW,你需要在這個觸發器中插入子句到某個表。

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

(和我沒有看到承諾,也許ü對autocommmit - 我不知道)

廣告1)條件

IF row_count IS NULL then 

是假的,bacause null不是0, 如果u有SELECT COUNT(*),那麼將有每次號碼,然後使用條件:

IF (row_count = 0) then 
  • 1 = NULL =假
  • 1!= NULL =假
  • 0 = NULL =假
  • 空是空=真
狀況

空值,只需要運營商是/不和不能與其他任何東西進行競爭