【问题标题】:Java Stored Procedure doesn't work on DB2/400 V6R1 - It Used to work on V5R4Java 存储过程在 DB2/400 V6R1 上不工作 - 它曾经在 V5R4 上工作
【发布时间】:2011-03-21 19:14:54
【问题描述】:

存储过程定义为:

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 Navigator,我授予了读取和执行权限。 Java 类文件在 /QIBM/UserData/OS400/SQLLib/Function/ETL.CLASS 上的 de AS/400 内部复制和编译。

当我尝试使用call MYSCHEMA.LOAD_ETL() 执行存储过程时,出现错误:

[SQL4303] Java 存储过程或用户自定义函数名称,无法从外部名称字符串中识别特定名称 spec-name。

说明:声明此存储过程或用户定义函数的 CREATE PROCEDURE 或 CREATE FUNCTION 语句具有格式错误的 EXTERNAL NAME 子句。外部名称的格式必须如下:“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 没有权限对对象名进行操作操作。

使用 System i Navigator,我授予了 /QIBM/UserData/OS400/SQLLib/Function/ETL.CLASS 上 Java 类文件的读取和执行权限

我明白了

CPFA0A9(找不到对象):/QIBM/UserData/OS400/SQLLib/Function/com.mycompany.ETL.class

所以我把它打包成一个jar文件并复制到/QIBM/UserData/OS400/SQLLib/Function/etl.jar

我又重新创建了一次存储过程,但它仍然不起作用。

然后我将存储过程重新创建为:

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 ;

再一次,还是不行。

提前感谢您的帮助。

【问题讨论】:

    标签: java stored-procedures db2 ibm-midrange


    【解决方案1】:

    这对我有用:不要为 Java 文件指定一个包,将其 .class 放入 Function 文件夹并在过程中设置此EXTERNAL NAME:'ETL.loadETL'

    【讨论】:

      【解决方案2】:

      这是我为使其正常工作所做的工作:

      • 方法必须是公共的和静态的。
      • 注意类和方法的名称和大小写。
      • 像这样创建 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/Function”
      • 你(应该)去那里;-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-01-02
        • 2022-01-26
        相关资源
        最近更新 更多