2011-11-24 51 views
2

好的,我是Oracle PL/SQL的新手,我偶然發現了一個我無法弄清楚的問題。 我有一個過程導致將數據從一個表傳輸到另一個表和一個在第二個表中插入時激活的觸發器。我預定該程序每分鐘運行一次(用於測試 - 一旦我找出結果,每天都會運行),使用DBMS_JOB.SUBMIT - 預定部分完美工作,但是在完成該過程之後觸發器未被觸發。我在插入子句之前和之後嘗試過,但它仍然不起作用。如果我直接調用該過程,它就會起作用,它確實觸發了觸發器。所以......我已經想知道預定的程序是否可以觸發觸發器?!Oracle PL/SQL:一個預定的過程,導致觸發一個觸發器?

這是日程代碼:

DECLARE 
    VJOBN BINARY_INTEGER; 
BEGIN 
    DBMS_JOB.SUBMIT(
    JOB => VJOBN, 
    INTERVAL => 'SYSDATE + 1/2880', 
    WHAT => 'BEGIN my_procedure(); END;' 
); 
END; 


create or replace TRIGGER TO_PRJ 
AFTER INSERT ON PROJECTS 
FOR EACH ROW 
BEGIN 
    IF INSERTING 
    THEN DBMS_OUTPUT.PUT_LINE('INSERTED PROJECT WITH ID: '||:NEW.PROJECT_ID||') 
    END IF; 
END;​ 

表項目上的ID號,名字VARCHAR2,以及其他一些不屬於重要。 該過程將標識和名稱從訂單傳輸到項目。

P.S.我使用的是http://apex.oracle.com,當我從它得到時間戳時,實際上是在我身後6小時 - 不知道它是否可以有任何意義...

+0

Oracle作業將照常進行。不需要擔心觸發。如果在存儲過程或表中設置觸發器,它將像往常一樣運行。順便說一句,爲什麼你把「存在和結束」放在什麼條款中? – ppshein

+0

@ppshein嗯......我很擔心觸發器,因爲它在作業調用存儲過程時不運行。我把最終目​​標放在了最後,因爲這就是我在其中一篇我讀過的教程中看到的 - 不再記得是哪一本,在試圖找出它的時候搜索了十億個。 – Izumi

回答

3

DBMS_OUTPUTDBMS_JOB不按照您嘗試使用它們的方式工作。計劃的作業可能正在運行,觸發器正在觸發 - 但由於需要在執行DBMS_OUTPUT命令的會話(即DBMS_JOB使用的內部會話)中激活DBMS_OUTPUT,因此您將永遠不會看到任何輸出。

DBMS_OUTPUT的輸出在會話中不可見,所以發出DBMS_JOB.submit命令的會話將不會接收輸出,即使該會話的DBMS_OUTPUT已激活。

+0

是的,我剛剛讀到它並意識到發生了什麼。但是,有沒有辦法使用觸發器來輸出消息? – Izumi

+3

你可以例如使用表格進行通信,或使用UTL_FILE寫入文件。 –

0

嘗試使用調度程序,它比工作好多了。並帶上觸發器和表格的代碼,它可能會幫助

+0

我試着用調度程序 - 程序執行,但觸發器不會觸發。我用觸發器代碼更新了第一篇文章。 – Izumi

+0

有辦法從調度程序發送消息,我從來沒有使用它,但它們存在。如果你需要消息,爲什麼不能使用特殊的表格並在那裏插入數據? – Maep

相關問題