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

我想使用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返回我的resultSet行

    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) );

以CUSTOMER_REC格式返回我的选择结果集,并以 Java将其读取为

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

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

ppwpp 回答:从这些1.sys_refcursor 2.自定义JSON 3.来自Oracle 12c plsql过程Java 8的自定义对象/记录类型中选择哪个更好?

如您在选项1的代码中所看到的,SYS_REFCURSOR映射到Java中的ResultSet,因此当您关闭ResultSet时,光标将关闭。

请注意,当ResultSet关闭时,或者Statement执行另一个SQL语句时,Statement对象会自动关闭,而当{{ {1}}已关闭。

即使对于池连接,调用Statement也会将连接返回到池,因此物理连接保持打开状态,对Connection的调用仍会关闭{{ 1}},因此也会关闭所有connection.close()个对象。

如果您的代码在使用close()之后运行了一段时间,尤其是如果您的代码执行了循环以处理多个Statement对象,则应始终关闭Connection对象完成操作后,最好使用 try-with-resources

如果在使用ResultSet对象后不久关闭了连接,则可以依靠该连接为您关闭ResultSet对象。如果不确定,请自己关闭它们。

关于您的问题,选项1最好。选项2会慢很多,而选项3则需要更多工作。

本文链接:https://www.f2er.com/3146889.html

大家都在问