我很难弄清楚这一点。我知道一定有办法做到这一点,而且我可能非常接近(也可能不是)。我想从表中删除一组记录并返回在一个语句中删除的记录。该表是一个队列,我需要从中弹出一些记录。
这可以通过两条语句完成工作:
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/