从 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