Oracle-11g-R2
從 Oracle 數據庫 11g 中的觸發器呼叫儲存過程時出錯
我正在嘗試創建一個觸發器,該觸發器在插入/更新表時呼叫一些 Java 程式碼。我知道可能的性能問題,我不需要建議我不應該這樣做;我只需要知道我做錯了什麼。
我創建了以下 Java 原始碼:
CREATE OR REPLACE AND COMPILE JAVA SOURCE NAMED TryJavaHelperSource AS import java.io.*; public class TryJavaHelper { public static void Run(String arg1, String arg2) throws Exception { // … return; } } /
我創建了一個呼叫這個 Java 源的儲存過程:
CREATE OR REPLACE PROCEDURE TryJavaHelperRun (arg1 IN VARCHAR2, arg2 IN VARCHAR2) AS LANGUAGE JAVA NAME 'TryJavaHelper.Run (java.lang.String, java.lang.String)'; /
我正在嘗試在此表上創建觸發器:
create table TryTable ( arg1 varchar2(20), arg2 varchar2(100) );
嘗試創建以下觸發器時出現編譯錯誤:
create or replace trigger TRYTABLE_BEF_UPD_ROW before update or insert on TryTable for each row begin CALL TryJavaHelperRun(:new.arg1, :new.arg2); end; /
這是我得到的錯誤:
SQL> sho err Errors for TRIGGER TRYTABLE_BEF_UPD_ROW: LINE/COL ERROR -------- ----------------------------------------------------------------- 2/6 PLS-00103: Encountered the symbol "TRYJAVAHELPERRUN" when expecting one of the following: := . ( @ % ; The symbol ":=" was substituted for "TRYJAVAHELPERRUN" to continue.
為什麼會發生此錯誤,我該如何解決?
更新:
CALL
當我取出聲明時,它似乎有效。什麼時候使用CALL
以及何時只鍵入函式/過程的名稱的規則是什麼?
您的觸發器不需要
CALL
關鍵字。create or replace trigger TRYTABLE_BEF_UPD_ROW before update or insert on TryTable for each row begin TryJavaHelperRun(:new.arg1, :new.arg2); end; /
通常,您永遠不應該
CALL
在 PL/SQL 塊中使用——只執行該過程。我認為這CALL
是一些古老版本的 Oracle 遺留下來的一些古老的語法殘餘。它允許您用單個CALL
語句替換作為觸發器主體的整個 PL/SQL 塊,即create or replace trigger TRYTABLE_BEF_UPD_ROW before update or insert on TryTable for each row call TryJavaHelperRun(:new.arg1, :new.arg2) /
就我個人而言,我從未遇到過放棄“正常”PL/SQL 語法以支持
CALL
在觸發器中使用的情況。這假設您通常可以
TryJavaHelperRun
成功呼叫該過程。