gpt4 book ai didi

java - 如何从游标中获取记录

转载 作者:行者123 更新时间:2023-12-01 07:52:42 24 4
gpt4 key购买 nike

我正在尝试使用 PL SOL 游标从 Oracle 获取一些记录。这是我的代码,

程序参数:

PT_CLAIMS                IN      CLIM_BEAN_TAB,
PO_CLAIMS_CUSROR OUT SYS_REFCURSOR

迭代代码:

FOR I IN 1 .. PT_CLAIMS.LAST LOOP

SELECT SEQ_TB_CLIAM.NEXTVAL INTO CLAIM_ID FROM DUAL;


INSERT INTO TL_CLAIMS
(
CLAIM_ID,
CLAIM_USER,
CLAMIANT_ID
)
VALUES(
CLAIM_ID,
PT_CLAIMS(I).USER_ID,
PT_CLAIMS(I).CLAMIANT_ID
);

OPEN PO_CLAIMS_CUSROR FOR
SELECT CLAIM_ID AS CALIM_ID FROM DUAL;


end loop;

我在java中使用Out游标。但是每当我使用 ResultSet 迭代输出游标时,我只得到一条记录。

如何在循环中将值添加到光标。

最佳答案

每次循环 IN 表内容时,都会重新打开 OUT sys_refcursor。每次前一个引用游标都会被丢弃并创建一个新的引用游标。 (希望Oracle能够在后台正确清理废弃的)。

当循环退出时,OUT 参数具有与 IN 表中最后一个条目相对应的声明 ID。您不会将每个声明 ID 添加到单个 OUT 引用游标 - 您不能这样做。

您可以维护生成的 ID 的本地表,然后在循环之后从该本地表打开 OUT 游标。或者,您可以在 forall 循环中将循环替换为单个插入语句,以允许您使用返回批量收集到:

create procedure p42(pt_claims in claim_bean_tab,
po_claims_cursor out sys_refcursor)
as
l_claim_ids sys.odcinumberlist;
begin
forall i in 1..pt_claims.count
insert into tl_claims(claim_id, claim_user_id, claimant_id)
values (seq_tb_claim.nextval, pt_claims(i).user_id, pt_claims(i).claimant_id)
returning claim_id bulk collect into l_claim_ids;

open po_claims_cursor for
select column_value from table(l_claim_ids);
end;
/

它使用预定义的类型,它是数字的可变数组;由于它是一种 SQL 类型,因此可以与 table() 一起使用(作为 table collection expression )。

SQL fiddle 似乎又被破坏了,所以一个完整的工作示例:

create type claim_bean as object (user_id number, claimant_id number);
/

create type claim_bean_tab as table of claim_bean;
/

create table tl_claims (claim_id number, claim_user_id number, claimant_id number)
/

create sequence seq_tb_claim;
/

create procedure p42(pt_claims in claim_bean_tab,
po_claims_cursor out sys_refcursor)
as
l_claim_ids sys.odcinumberlist;
begin
forall i in 1..pt_claims.count
insert into tl_claims(claim_id, claim_user_id, claimant_id)
values (seq_tb_claim.nextval, pt_claims(i).user_id, pt_claims(i).claimant_id)
returning claim_id bulk collect into l_claim_ids;

open po_claims_cursor for
select column_value from table(l_claim_ids);
end;
/

set serveroutput on
declare
l_claims claim_bean_tab;
l_claims_cursor sys_refcursor;
l_claim_id tl_claims.claim_id%type;
begin
l_claims := new claim_bean_tab();
l_claims.extend(3);
l_claims(1) := new claim_bean(42, 123);
l_claims(2) := new claim_bean(57, 456);
l_claims(3) := new claim_bean(13, 789);

p42(l_claims, l_claims_cursor);
loop
fetch l_claims_cursor into l_claim_id;
exit when l_claims_cursor%notfound;
dbms_output.put_line('Got claim ID from cursor: ' || l_claim_id);
end loop;
close l_claims_cursor;
end;
/

select * from tl_claims
/

PL/SQL procedure successfully completed.

Got claim ID from cursor: 1
Got claim ID from cursor: 2
Got claim ID from cursor: 3

关于java - 如何从游标中获取记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34652082/

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