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.CLOB
或OracleTypes.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_type
和single_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