在这些 1.sys_refcursor 2. custom JSON 3.custom object/record Oracle 12c plsql 过程中选择哪个更好,Java 8?

Which is better for selecting among these 1.sys_refcursor 2. custom JSON 3.custom object/record type from Oracle 12c plsql procedure, Java 8?

我想使用 Select 操作从 Oracle 12c 数据库 PL/SQL 获取数据。 return 数据有 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 格式所以 我可以 return 我的结果集行使用自定义 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); Return json.to_string();

并在 Java

中将其作为字符串读取
  1. 我可以使用

    TYPE CUSTOMER_REC IS RECORD ( CUST_NO NUMBER, CUST_CODE VARCHAR2 (50), CUST_NAME VARCHAR2 (500) );

将我的 select 结果集返回为 CUSTOMER_REC 格式并以 Java 读作

cs.registerOutParameter(1, OracleTypes.STRUCT, "typeName");

有人可以详细解释每个部分,哪个更好用(性能角度),在这种情况下哪个是旧方法? Sys_RefCursor 是否被 Oracle 环境隐式关闭?

正如您在选项 1 的代码中看到的那样,SYS_REFCURSOR 映射到 Java 中的 ResultSet,因此当您关闭 ResultSet.

注意 ResultSet 对象在 Statement 关闭时自动关闭,或者当 Statement 执行另一个 SQL 语句时,StatementConnection 关闭时关闭。

即使是池连接,调用connection.close() returns连接到池,所以物理连接保持打开状态,调用close()仍然关闭所有Statement Connection 上的对象,因此也会关闭所有 ResultSet 个对象。

如果您的代码在使用 ResultSet 后运行了一段时间,尤其是如果您的代码执行了一个循环来处理多个 ResultSet 对象,您应该始终关闭 ResultSet 对象一旦你完成了它们,最好使用 try-with-resources.

如果连接在使用 ResultSet 对象后很快关闭,您可以依靠连接为您关闭 ResultSet 对象。如果您不确定,请自行关闭它们。

对于你的问题,选项1最好。选项 2 会慢得多,而选项 3 更费力。