gpt4 book ai didi

java - 如何在一条语句中删除记录并返回它们? SQL/Java

转载 作者:太空宇宙 更新时间:2023-11-04 11:57:21 25 4
gpt4 key购买 nike

我很难弄清楚这一点。我知道一定有办法做到这一点,而且我可能非常接近(也可能不是)。我想从表中删除一组记录并返回在一个语句中删除的记录。该表是一个队列,我需要从中弹出一些记录。

这可以通过两条语句完成工作:

select id, add_date from my_queue where rownum <= 10;
-- save for processing
delete from my_queue where rownum <= 10;

如何将这些组合成 1 个语句,然后用 Java 读取结果?

我看过this SO question我尝试在问题中实现这两种方法,但是,在我的例子中,我有 2 列要输出,并且我需要使用 bulk Collect into 子句,因此输出将是一个表。通过这种方式,我无法弄清楚需要做什么来正确定义和注册输出以执行匿名 PL/SQL 语句。

这是我最接近的尝试:

StringBuilder sql = new StringBuilder();
sql.append("BEGIN ");
sql.append(" delete from my_queue where rownum <= 10 ");
sql.append(" returning _id into ?; ");
sql.append("END; ");

CallableStatement cstmt = con.prepareCall(sql.toString());
cstmt.registerOutParameter(1, OracleTypes.CURSOR);
//cstmt.registerOutParameter(1, OracleTypes.NUMBER);
//cstmt.registerOutParameter(1, OracleTypes.ARRAY);

cstmt.execute(); // throws error, see comments below

以下是根据注册的输出类型执行时出现的各种错误:

Using CURSOR: ORA-00932: inconsistent datatypes: expected CURSER got NUMBER

Using NUMBER: ORA-01422: exact fetch returns more than requested number of rows

Using ARRAY: ORA-03115: unsupported network datatype or representation

最佳答案

我结合了几个不同帖子/网站的解决方案,并使用bulkcollect into子句提出了一个可行的解决方案:

create or replace type queue_record as object (
id number(10),
add_date date
);

create or replace type my_queue_type as table of queue_record;

create or replace procedure pull_from_queue (
pull_size in number,
pulled_records out sys_refcursor
)
is
tbl my_queue_type;
begin

delete from my_queue
where id in (
select id from ( select * from my_queue order by add_date )
where rownum <= pull_size
)
returning queue_record(id, add_date)
bulk collect into tbl;

open pulled_records for
select * from table(cast(tbl as my_queue_type)) order by add_date;

end pull_from_queue;

关于java - 如何在一条语句中删除记录并返回它们? SQL/Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41247291/

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