从 plsql 调用 java 类文件时无法将 int 值分配给 A JAVA.OBJECT

Posted

技术标签:

【中文标题】从 plsql 调用 java 类文件时无法将 int 值分配给 A JAVA.OBJECT【英文标题】:Unable to assgin int value to ORA_JAVA.JOBJECT while calling java class files from plsql 【发布时间】:2019-05-11 06:53:28 【问题描述】:

我有一个 Java 存根,我试图从 PL/SQL 调用,在我将 Java 代码导入 Oracle 表单之后,我的所有方法在 Java 代码中都将输入参数作为 Int 数据类型,以及之后的所有过程和函数导入的数据类型为 ORA_JAVA.JOBJECT。

有人可以帮我为 ORA_JAVA.JOBJECT 变量分配 int 值吗? 尝试使用 Int_array 进行分配:

DECLARE
    jo ora_java.jobject;
    a0 ora_java.jobject; 
    xo ora_java.jobject; 
    ex ora_java.jobject;
    a number;
BEGIN 
    JO := EmployeeInfoService.new;   
    a0 := EmployeeInfoService.new;   

    a0 := ORA_JAVA.NEW_INT_ARRAY(1);    
    ORA_JAVA.SET_INT_ARRAY_ELEMENT(a0, 0, 10001);   
    xo := employeeInfoServicePortType.getEmpInfoById(JO,a0, a0);
EXCEPTION
        WHEN ORA_JAVA.JAVA_ERROR then 
            MESSAGE ('Unable to call out to Java, ' ||ORA_JAVA.LAST_ERROR);
        WHEN ORA_JAVA.EXCEPTION_THROWN then
            ex := ORA_JAVA.LAST_EXCEPTION;  
        WHEN OTHERS THEN 
            MESSAGE('Error : ' || sqlerrm);`enter code here`
END;

执行此结束时出现错误:参数 1 的对象类型无效。

在成功执行此操作后,我应该得到带有员工信息的 xo。

【问题讨论】:

【参考方案1】:

我想你可以看到 a0 首先设置为EmployeeInfoService.new,然后设置为一个数组;有效地覆盖上一行。

此外,您需要确切了解过程employeeInfoServicePortType.getEmpInfoById 所期望的对象类型。在为getEmpInfoById 生成的代码中,您可能会看到以下行之一:

    JNI.ADD_OBJECT_ARG(args, a0); JNI.ADD_OBJECT_ARG(args, a0, 'java/lang/Integer');

如果它看起来像 #1,那么传入一个像 10001 这样的值就可以了。

如果它看起来像 #2,您必须将 java.lang.Integer 对象导入您的表单并传入像 Integer.new(10001) 这样的值。

Oracle Forms 可以将String 转换为VARCHAR2,并将int 转换为NUMBER,但其他所有内容都将设置为ORA_JAVA.JOBJECT。

以下 java 方法声明显示了在 Oracle Forms 中生成的代码的区别:

  public getEmpInfoById(int arg0, int arg1)... this would generate #1
  public getEmpInfoById(Integer arg0, Integer arg1)... this would generate #2

我怀疑你的情况是后者。如果您有权访问 Java 代码,请尝试将其更改为使用 int 而不是 Integer。如果这不可行,请将 java.lang.Integer 对象导入您的表单/库。然后按如下方式使用:

PROCEDURE test IS
    lo_integer ORA_JAVA.JOBJECT;
BEGIN
    lo_integer := Integer.new(10001);
    -- rest of the code
END;

这里有几个链接,其中包含有关 Java 导入器的更多信息:

https://www.oracle.com/technetwork/developer-tools/forms/javaimporter-130505.pdf https://docs.oracle.com/cd/A97335_02/apps.102/a86202/appc.htm

【讨论】:

以上是关于从 plsql 调用 java 类文件时无法将 int 值分配给 A JAVA.OBJECT的主要内容,如果未能解决你的问题,请参考以下文章

从Oracle PLSQL调用java时如何将参数传递给java

JDBC - 从 JAVA 调用 PLSQL 给出 Java.sql.SQLException: ORA-06550

将对象数组从 PLSQL 传递到 Java 函数时出错

从 Spring JAVA 中的 oracle PLSQL 函数获取结果集时出错

Oracle PLSQL怎么用调用函数包

25 Java学习之标准I/O流重定向