gpt4 book ai didi

java - 在带有 Java/JDBC 的 Oracle PL/SQL 中使用游标并获取结果

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:49:10 25 4
gpt4 key购买 nike

我有一个这样构造的 PL/SQL 查询:

DECLARE
a NUMBER;
B NUMBER;
CURSOR cursor
IS
( SOME SELECT QUERY);
BEGIN
OPEN cursor;
LOOP
SOME STUFF;
END LOOP;
CLOSE cursor;
END

如何使用 jdbc 从 Java 代码运行此查询并获取结果集?我试过在不使用游标的情况下运行查询,并且它运行正常。我想不出在 Java 代码中执行此操作的方法。如果我直接在 oracle 客户端上运行查询,它就没有问题。所以查询没有问题。

附言由于某些限制,我不想将代码存储为存储过程并调用它。

最佳答案

@拉贾特,

你可以试试下面的方法吗:

要检索游标,您应该在包规范中将其声明为 REF CURSOR。

  --Creating the REF CURSOR type
type g_cursor is ref cursor;

在 spec 和 body 中,您需要在过程签名中声明一个 out REF CURSOR 变量,如上文所述。

  procedure PRO_RETURN_CARS(
i_id in tbl_car.car_id%type,
o_cursor in out g_cursor);

游标必须在过程体中打开才能返回,这样:

open o_cursor for
select car_id, company, model, color, hp, price
from tbl_car
where car_id = i_id;

完整的包:

create or replace package PAC_CURSOR is
--Creating REF CURSOR type
type g_cursor is ref cursor;

--Procedure that return the cursor
procedure PRO_RETURN_CARS(
i_id in tbl_car.car_id%type,
o_cursor in out g_cursor); -- Our cursor

end PAC_CURSOR;
/

create or replace package body PAC_CURSOR is
procedure PRO_RETURN_CARS(
i_id in tbl_car.car_id%type,
o_cursor in out g_cursor) is

begin
--Opening the cursor to return matched rows
open o_cursor for
select car_id, company, model, color, hp, price
from tbl_car
where car_id = i_id;

end PRO_RETURN_CARS;

end PAC_CURSOR;

我们已经准备好 Oracle 端,现在我们需要创建 Java 调用

过程如何返回游标,我们将使用 java.sql.CallableStatement 实例:

CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETURN_CARS(?,?)}");

registerOutParameter 将获取oracle.jdbc.OracleTypes.CURSOR 类型并返回一个java.sql.ResultSet 实例。我们可以像普通的 Iterator 一样迭代 ResultSet

SELECT 返回的每一行列将使用相应的 getter 表示为一个映射。例如,当列的值是 varchar 时,我们将调用 getString() 方法,当是日期时,我们将调用 getDate() 方法等等。

完整的代码是这样的:

//Calling Oracle procedure
CallableStatement cs = conn.prepareCall("{call PAC_CURSOR.PRO_RETURN_CARS(?,?)}");

//Defining type of return
cs.registerOutParameter("o_cursor", OracleTypes.CURSOR);
cs.setLong("i_id", id);

cs.execute();//Running the call

//Retrieving the cursor as ResultSet
ResultSet rs = (ResultSet)cs.getObject("o_cursor");

//Iterating the returned rows
while(rs.next()){
//Getting column values
System.out.println("ID: " + rs.getLong("car_id"));
System.out.println("Manufacturer: " + rs.getString("company"));
System.out.println("Model: " + rs.getString("model"));
System.out.println("Color: " + rs.getString("color"));
System.out.println("HP: " + rs.getString("hp"));
System.out.println("Price: " + rs.getFloat("price"));
}

最后您将获得 SELECT 子句中返回的任何值。

关于java - 在带有 Java/JDBC 的 Oracle PL/SQL 中使用游标并获取结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16047179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com