Java-PLSQL-来自java的记录调用表

PLSQL包过程声明

TYPE custom_type IS TABLE OF single_rec_type; TYPE single_rec_type IS RECORD( //id, name etc ) 

问题:

但是custom_type没有直接的Java类型表示[如OracleTypes.CLOBOracleTypes.CURSOR ],因为custom_type是PLSQL类型而不是SQL类型。

当我用Google搜索时,我遇到了这两个选项:代表它,

(1)从我们可以从java绑定的过程(或包装器PLSQL函数)创建一个SQL TYPE。 参考: java – 在oracle存储过程中传递数组

(2)将输出参数注册到我们的类型,并使用SQLData对象来表示记录。 参考: 如何在oracle中将表作为out参数获取

 callableStatement.registerOutParameter(8, OracleTypes.ARRAY, "custom_type"); 

这样做,我收到错误:

 java.sql.SQLException: invalid name pattern: MYDB_OWNER.custom_type at oracle.jdbc.oracore.OracleTypeADT.initMetadata(OracleTypeADT.java:554) at oracle.jdbc.oracore.OracleTypeADT.init(OracleTypeADT.java:471) 

一个建议是在模式中声明custom_type TYPE,而不是在包内声明。 或者通过创建公共同义词和给予补助金。

问题 – 关于第二种方法,在模式级别声明任何自定义类型是否正确?

是的,这是唯一有效的方式。 我按照第二种方法中提到的链接如何在oracle中将表作为out参数

它工作。 包级别更改包括(1)在模式级别[声明全局,不在包内]声明custom_typesingle_rec_type ,以及(2)用AS OBJECT替换IS RECORD

Java代码与链接中提到的内容不同,包括在map.put("SINGLE_REC_TYPE", Class.forName("com.example.SRecord"));给出类的完整名称map.put("SINGLE_REC_TYPE", Class.forName("com.example.SRecord"));

另一件需要注意的是,在那个例子中,它提到了stream.readString(); 。 如果您阅读了API,它会说“读取流中的下一个属性并将其作为Java编程语言中的String返回。” 。 因此,如果对象内部有三个属性,则使用此方法三次

 id = stream.readString(); name = stream.readString(); designation = stream.readString(); 

该帖中提到了另一点; 关于对象内属性的数据类型。 如果存在类型不匹配,则会出现内部表示错误。

例如:正确的方式:

SRecord.java

 public String id; \\varchar in plsql procedure public String name; \\varchar in plsql procedure