在这些 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
程序结束时没有给我想要的结果。
使用自定义 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
中将其作为字符串读取
我可以使用
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 语句时,Statement
在 Connection
关闭时关闭。
即使是池连接,调用connection.close()
returns连接到池,所以物理连接保持打开状态,调用close()
仍然关闭所有Statement
Connection
上的对象,因此也会关闭所有 ResultSet
个对象。
如果您的代码在使用 ResultSet
后运行了一段时间,尤其是如果您的代码执行了一个循环来处理多个 ResultSet
对象,您应该始终关闭 ResultSet
对象一旦你完成了它们,最好使用 try-with-resources.
如果连接在使用 ResultSet
对象后很快关闭,您可以依靠连接为您关闭 ResultSet
对象。如果您不确定,请自行关闭它们。
对于你的问题,选项1最好。选项 2 会慢得多,而选项 3 更费力。
我想使用 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
程序结束时没有给我想要的结果。
使用自定义 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
中将其作为字符串读取我可以使用
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 语句时,Statement
在 Connection
关闭时关闭。
即使是池连接,调用connection.close()
returns连接到池,所以物理连接保持打开状态,调用close()
仍然关闭所有Statement
Connection
上的对象,因此也会关闭所有 ResultSet
个对象。
如果您的代码在使用 ResultSet
后运行了一段时间,尤其是如果您的代码执行了一个循环来处理多个 ResultSet
对象,您应该始终关闭 ResultSet
对象一旦你完成了它们,最好使用 try-with-resources.
如果连接在使用 ResultSet
对象后很快关闭,您可以依靠连接为您关闭 ResultSet
对象。如果您不确定,请自行关闭它们。
对于你的问题,选项1最好。选项 2 会慢得多,而选项 3 更费力。