java - 1.sys_refcursor 2.自定义 JSON 3.自定义对象/记录类型从 Oracle 12c plsql 过程,Java 8 中选择哪个更好?

标签 java oracle plsql cursor sys-refcursor

我想使用 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

在程序结束时它没有给我想要的结果。

  1. 使用自定义 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 中将其读取为字符串

  1. 我可以用吗

    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/

相关文章:

java - java中的 Elasticsearch 查询

java - 使用默认值声明 Thymeleaf 变量后如何对其进行算术运算?

sql - 甲骨文 :Compare dates only by the Hour

oracle - 根据开始日期和工作/午餐时间 PL/SQL 计算截止日期

oracle - 迭代 PL/SQL 中的列

java - 使用 Java 8 流过滤内部 Map 的值

java - map 获取值查询

java - 开发 Web 服务的 Java 技术最佳实践?

sql - 取消 SQL *PLUS 执行而不引发错误

mysql - 由 : java. sql.SQLSyntaxErrorException : ORA-01747: invalid user. table.column、table.column 或列规范引起