我想使用 Select 操作从 Oracle 12c 数据库 PL/SQL 中获取数据。 我有 3 个选项来返回数据。 1. 使用 Sys_RefCursor
口语部分
Procedure Get_Data(
o_Cursor In Out SYS_REFCURSOR,
i_Row_Id In Number
)
Is
Begin
Open o_Cursor For
Select * From My_Table Where Row_Id = i_Row_Id;
End;
Java 部分
CallableStatement cs = conn.prepareCall("{call My_Package_Name.Get_Data(?,?)}");
cs.registerOutParameter(1, OracleTypes.CURSOR);
cs.setInt(2, data.get("row_id").getAsInt());
cs.execute();
rs = (ResultSet)cs.getObject(1);
但是,在这种情况下,我不知道 Oracle Procedure 本身是否隐式关闭 Cursor。
当我使用
Close o_cursor
在程序结束时它没有给我想要的结果。
使用自定义 Apex Json 因为我使用 Oracle 12c 它支持 Json 格式所以 我可以使用自定义 Json 返回我的结果集行
Select * Into rt From My_Table t Where t.Row_Id = 1; json.Push('row_id', rt.Row_Id); json.Push('row_name', rt.Row_Name); 返回 json.to_string();
并在 Java 中将其读取为字符串
我可以用吗
TYPE CUSTOMER_REC 是记录 ( CUST_NO NUMBER, CUST_CODE VARCHAR2 (50), CUST_NAME VARCHAR2 (500) );
将我选择的结果集返回为 CUSTOMER_REC 格式并以 Java 将其读作
cs.registerOutParameter(1, OracleTypes.STRUCT, "typeName");
有人可以详细解释每个部分,哪个更好用(性能角度),在这种情况下哪个是旧方法?以及 Sys_RefCursor 是否被 Oracle 环境隐式关闭?
最佳答案
正如您可以在选项 1 的代码中看到的那样,SYS_REFCURSOR
映射到 ResultSet
在 Java 中,所以当您关闭 ResultSet
时游标也会关闭.
请注意 ResultSet
Statement
时对象自动关闭已关闭,或者当 Statement
执行另一个 SQL 语句,并且 Statement
Connection
时关闭已关闭。
即使是连接池,调用connection.close()
将连接返回到池中,因此物理连接保持打开状态,调用 close()
仍然关闭所有 Statement
Connection
上的对象, 因此关闭所有 ResultSet
对象也是。
如果您的代码在使用 ResultSet
后运行了一段时间,特别是如果您的代码执行一个循环来处理多个 ResultSet
对象,您应该始终关闭 ResultSet
对象,最好是使用 try-with-resources。
如果连接在使用 ResultSet
后很快关闭对象,您可以依靠关闭 ResultSet
的连接对象给你。如果您不确定,请自行关闭它们。
至于你的问题,选项1是最好的。选项 2 会慢得多,而选项 3 的工作量更大。
关于java - 1.sys_refcursor 2.自定义 JSON 3.自定义对象/记录类型从 Oracle 12c plsql 过程,Java 8 中选择哪个更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58743573/