Stored-Procedures

EXTERNAL NAME 參數的格式是什麼?

  • December 8, 2020

cl帶有方法的 Java 類mth駐留在包pck中時,我應該在EXTERNAL NAME子句中放入什麼CREATE PROCEDURE

我試過

CREATE PROCEDURE mth (arg1 INTEGER) LANGUAGE JAVA EXTERNAL NAME 'myjar:pck/cl.mth'
CREATE PROCEDURE mth (arg1 INTEGER) LANGUAGE JAVA EXTERNAL NAME 'myjar:pck.cl.mth'
CREATE PROCEDURE mth (arg1 INTEGER) LANGUAGE JAVA EXTERNAL NAME 'myjar:cl.mth'

但無論哪種方式,我得到The user defined function or procedure "mth" was unable to map to a single Java method.. SQLCODE=-20204, SQLSTATE=46008, DRIVER=3.68.61

在 Java 端,該方法聲明如下:

public void send_mail( // with or w/o static, with or w/o synchronized
   final String P_TO,
   final String P_CC,
   final String P_BCC,
   final String P_FROM,
   final String P_SUBJECT,
   final String P_TEXT_MSG,
   final String P_HTML_MSG,
   final String P_ATTACH_NAME,
   final String P_ATTACH_MIME,
   final byte[] P_ATTACH_BLOB,
   final String P_SMTP_HOST,
   final int P_SMTP_PORT,
   final String P_USER_NAME,
   final String P_PASSWORD

在 DB2 端,正在嘗試按如下方式創建該過程:

CREATE PROCEDURE send_mail(
 IN P_TO          VARCHAR(4096),
 IN P_CC          VARCHAR(4096) DEFAULT NULL,
 IN P_BCC         VARCHAR(4096) DEFAULT NULL,
 IN P_FROM        VARCHAR(4096),
 IN P_SUBJECT     VARCHAR(32672),
 IN P_TEXT_MSG    VARCHAR(32672) DEFAULT NULL,
 IN P_HTML_MSG    VARCHAR(32672) DEFAULT NULL,
 IN P_ATTACH_NAME VARCHAR(255) DEFAULT NULL,
 IN P_ATTACH_MIME VARCHAR(100) DEFAULT NULL,
 IN P_ATTACH_BLOB BLOB DEFAULT NULL,
 IN P_SMTP_HOST   VARCHAR(255),
 IN P_SMTP_PORT   INTEGER DEFAULT 25,
 IN P_USER_NAME   VARCHAR(255) DEFAULT NULL,
 IN P_PASSWORD    VARCHAR(32672) DEFAULT NULL
)
LANGUAGE java
PARAMETER STYLE java
FENCED THREADSAFE
EXTERNAL NAME 'javadb2:db2.smtp.send_mail' -- with or w/o db2

每次sqlj.db2_install_jar它出現在function\usernameDB2 文件夾層次結構中的文件夾下時,我都檢查並再次檢查。

正確的格式是<JAR name>:<class name>.<method name>,<class name>是完全限定的,即包含包名。由於您仍然收到此錯誤,因此您的方法簽名可能不符合您使用的約定。不指定PARAMETER STYLE選項,表示DB2GENERAL預設使用,不推薦。使用PARAMETER STYLE JAVA並確保方法簽名正確(public static void mth(int arg1)在您設計的範例中)。

另請注意

要更新 JAR 文件中內置的 Java™ 常式,您必鬚髮出一個CALL SQLJ.REFRESH_CLASSES()語句來強制數據庫管理器裝入新類。如果您在更新 Java 常式類後不發出該CALL SQLJ.REFRESH_CLASSES()語句,那麼數據庫管理器將繼續使用這些類的先前版本。當 aCOMMITROLLBACK發生時,數據庫管理器刷新類。(來源

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