2011-03-21 18 views
1

存儲過程定義的工作是:Java存儲過程不會對DB2/400 V6R1工作 - 它曾經在V5R4

CREATE PROCEDURE MYSCHEMA.LOAD_ETL () 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'ETL!loadETL' 
    PARAMETER STYLE JAVA ; 

用的System i導航我授予讀取和執行權限。 Java類文件被複制並編譯德AS/400的內部上/QIBM/UserData/OS400/SQLLib/Function/ETL.CLASS

當我試着使用call MYSCHEMA.LOAD_ETL()執行存儲過程,我得到的錯誤:

[SQL4303] Java stored procedure or user-defined function name, specific name spec-name could not be identified from external name string.

Explanation: The CREATE PROCEDURE or CREATE FUNCTION statement that declared this stored procedure or user-defined function had a badly formatted EXTERNAL NAME clause. The external name must be formatted as follows: "package.subpackage.class!method".

所以,我重構了類com.mycompany.ETL。並複製和重新編譯它的AS/400 /QIBM/UserData/OS400/SQLLib/Function/com/mycompany/ETL.class內。

我重新創建存儲過程:

CREATE PROCEDURE MYSCHEMA.LOAD_ETL () 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'com.mycompany.ETL!loadETL' 
    PARAMETER STYLE JAVA ; 

但是它仍然無法正常工作。

現在的錯誤是:

SQL0551. Authorization-ID does not have the privilege to perform operation operation on object name.

用的System i導航我授予讀取和執行權限的Java類文件上/QIBM/UserData/OS400/SQLLib/Function/ETL.CLASS

我得到

CPFA0A9 (Object not found): /QIBM/UserData/OS400/SQLLib/Function/com.mycompany.ETL.class

所以我打包成一個jar文件,並拷貝到/QIBM/UserData/OS400/SQLLib/Function/etl.jar

我重新創建存儲過程的一個更多的時間,但它仍然無法正常工作。

然後我重新-again-存儲過程爲:再次

CREATE PROCEDURE MYSCHEMA.LOAD_ETL () 
    LANGUAGE JAVA 
    SPECIFIC MYSCHEMA.LOAD_ETL 
    NOT DETERMINISTIC 
    MODIFIES SQL DATA 
    CALLED ON NULL INPUT 
    EXTERNAL NAME 'com/mycompany/ETL!loadETL' 
    PARAMETER STYLE JAVA ; 

,它仍然無法正常工作。

在此先感謝您的幫助。

回答

0

這個工作對我說:不specifiy一個包的Java文件,把它的.class到功能文件夾和程序設置此EXTERNAL NAME'ETL.loadETL'

0

這是我做了什麼得到它的工作:

  • 的方法必須是公共和靜態的。
  • 請注意類和方法的名稱和案例。
  • 創建SP這樣的:

    CREATE PROCEDURE LIBNAME/PROCNAME() 
    PARAMETER STYLE JAVA READS SQL DATA LANGUAGE JAVA EXTERNAL NAME 
    'MyClassName.methodName' 
    

(我使用 「系統」 命名,而不是使用的 「/」,如果它不是你的情況 「」)。

請注意,此示例與(幾乎)空方法有關,在現實生活中,您需要IN(和可能的OUT)參數。

  • 構建JAR文件
  • 打開它,得到的.class文件
  • 解壓縮到 「/ QIBM /的UserData/OS400/SQLLIB /功能」
  • 有你(應該)去; - )