Oracle-11g-R2

從 Oracle 數據庫 11g 中的觸發器呼叫儲存過程時出錯

  • June 19, 2012

我正在嘗試創建一個觸發器,該觸發器在插入/更新表時呼叫一些 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成功呼叫該過程。

引用自:https://dba.stackexchange.com/questions/19503