java - 我如何通过 JDBC 调用返回 UDO 的 PL/SQL 函数并解释该结果?

标签 java oracle jdbc

假设我的 UDO(用户定义对象)是:

create or replace
TYPE UDO_PERSON AS object (NAME VARCHAR2(100), AGE INTEGER);

我有一个 PL/SQL 函数

create or replace
FUNCTION CREATE_A_PERSON(NAME VARCHAR2)
RETURN UDO_PERSON
AS  
    AGE INTEGER;
BEGIN

    SELECT dbms_random.value(1,100) INTO AGE FROM DUAL;
    RETURN NEW UDO_PERSON(NAME, AGE);

END CREATE_A_PERSON;

我测试了以下方法并且它有效,并且有一些方法可以“解析”结果

...

String select = "SELECT CREATE_A_PERSON('my name') FROM DUAL";
Statement stmt=conn.createStatement();
ResultSet rs= stmt.executeQuery(select);
rs.next();

java.sql.Struct jdbcStruct = (java.sql.Struct)rs.getObject(1);

Object[] attrs = jdbcStruct.getAttributes();
for(int i=0;i<attrs.length;i++){
    System.out.println("attrs["+i+"] "+attrs[i].toString());
}

... 

但我想使用的是 CallableStatement ,例如:

String procedure = "{? = call CREATE_A_PERSON (?)}";
CallableStatement statement = conn.prepareCall(procedure);

statement.registerOutParameter(1, java.sql.Types.STRUCT); // I tested with OTHER, JAVA_OBJECT 
statement.setString(2, "Youre name");

ResultSet rs= statement.executeQuery(); // tried also with execute() and then statement.getObject()...still nothing
java.sql.Struct jdbcStruct = (java.sql.Struct)rs.getObject(1);

...

最后一段代码根据我使用的 java.sql.Type 和执行方法的类型抛出不同类型的异常。

有人吗?我搜索了 Oracle 文档,但发现它非常困惑。

最佳答案

所以解决方案是

String procedure = "{? = call CREATE_A_PERSON (?)}";
CallableStatement statement = conn.prepareCall(procedure);
statement.registerOutParameter(1, java.sql.Types.STRUCT, "UDO_PERSON");
statement.setString(2, "YOURE NAME");
statement.execute();
...

旧行:

statement.registerOutParameter(1, java.sql.Types.STRUCT);

换行:

statement.registerOutParameter(1, java.sql.Types.STRUCT, "UDO_PERSON");

从这里您只需“解析”java.sql.Struct 对象。集合也是如此(虽然我只测试了VARRAY_OF_NUM)你需要使用带有三个参数的registerOutParameter,否则你会看到一些异常,比如“ORA-03115:不支持的网络数据类型或表示”。显然,如果您的 PL/SQL 函数返回 VARRAY,请使用 statement.registerOutParameter(1, OracleTypes.ARRAY, "YOURE_VARRAY_TYPE");

关于java - 我如何通过 JDBC 调用返回 UDO 的 PL/SQL 函数并解释该结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8286769/

相关文章:

java - Netbeans 从 View 中隐藏包

sql - 如何在 Oracle sqlplus 中编写 for 循环?

Oracle SQL Union/Merge with Duplicates 问题

oracle - Oracle中如何确定表的大小

java - 通过 Java (JDBC) 连接到支持 SSL 的 Oracle DB

java - 如何使用Java套接字调用Telnet通信?

java - 注释尺寸小于数据库中的实际尺寸

java - LazyInitializationException,对于 int

java - 获取受影响的行数

java - 使用Java启动网络服务器