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

标签 java sql oracle plsql oracle11g

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

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

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/

相关文章:

java - 如何使用 jxls 上传和更新集 DB .xls 或 .xlsx 文件

Java servlet 相当于命令行 PHP?

MySQL 语法 - 选择基于多个参数的行?

java - 安卓 : Design shown in XML not reflected in the UI

java - 为什么@FunctionalInterface没有在合格的JDK的所有接口(interface)上使用?

sql - Azure SQL如何获取数组中满足条件的第一个元素

mysql - 如何将两个查询结果显示为一个

sql - 分别计算每列的不同值

sql - ORA-00936 : missing expression error when inserting values

java - 非常快地将多行插入 Oracle 数据库