如何编写一个 Oracle 过程以根据传递的数组返回两个游标

Posted

技术标签:

【中文标题】如何编写一个 Oracle 过程以根据传递的数组返回两个游标【英文标题】:How to write a Oracle procedure to return two cursors based on passed arrray 【发布时间】:2015-08-17 06:34:19 【问题描述】:

Requirement:- 我正在尝试编写一个过程,它将一个 id 数组作为 IN 参数, 和两个输出游标作为输出参数。基本上,该过程应该循环输入数组并检查 id 是否存在于 说表Employee,它应该返回两个游标

a) 第一个游标 - 包含所有存在的 id b) 第二个光标 - 包含所有不存在的 id

请帮我解决这个问题

创建了员工表:-

 CREATE TABLE EMPLOYEE
(ID NUMBER(10));

在其中插入 id:-

INSERT INTO EMPLOYEE VALUES(1);
INSERT INTO EMPLOYEE VALUES(2);
INSERT INTO EMPLOYEE VALUES(3);
INSERT INTO EMPLOYEE VALUES(4);
INSERT INTO EMPLOYEE VALUES(5);
INSERT INTO EMPLOYEE VALUES(6);
INSERT INTO EMPLOYEE VALUES(7);
INSERT INTO EMPLOYEE VALUES(9);
INSERT INTO EMPLOYEE VALUES(10);
INSERT INTO EMPLOYEE VALUES(11);

创建了自定义输入数组:-

CREATE OR REPLACE TYPE VALID_ID AS VARRAY(500) OF NUMBER(10);

程序声明是这样的:-

CREATE OR REPLACE PROCEDURE VALIDATE_ID(IN_ARR IN VALID_ID,PRSNT_ID OUT  SYS_REFCURSOR,MISS_ID OUT SYS_REFCURSOR)

如果 proc 的输入数组包含:- 1,2,3,4,5,6,7,8,9,12,13 那么 PRSNT_ID 应该包含:- 1,2,3,4,5,6,7,9 即员工表中存在的 ID 并且 MISS_ID 应该包含:- 8,12,13 即员工表中缺少的 ids

【问题讨论】:

贴出你到目前为止尝试过的代码?? @Tarun,我是一名刚接触 PL/SQL 的 Java 开发人员,即使你告诉我的方法会很棒,也不知道如何解决这个问题 PL/SQL 中没有数组,我猜您将使用特定的数组。我们仍然至少需要您程序的接口 编辑了我的问题希望对您有所帮助。 【参考方案1】:
create or replace procedure cursro_retur(arr in VALID_ID, pc1 out sys_refcursor, pc2 out sys_refcursor) is 
begin 
 open pc1  for 'select id from EMPLOYEE t ,table(:arr) b where t.id = b.column_value' using arr; -- valid
 open pc2 for 'SELECT b.column_value FROM employee a,table(:arr) b
 where  a.id (+) = b.column_value 
  and a.id is null' using arr;
end;

declare 
  pc1 sys_refcursor;
  pc2 sys_refcursor;
  v_list1  VALID_ID;
  v_list2  VALID_ID;
begin 
 cursro_retur( VALID_ID(1,2,3,8,11,89,11),pc1,pc2);

fetch pc1 bulk collect into v_list1;
fetch pc2 bulk collect  into v_list2;
 close pc1;
 close pc2; 
 dbms_output.put_line('valid');
 for rec in v_list1.first ..v_list1.last loop
  dbms_output.put_line(v_list1(rec));
 end loop; 
 dbms_output.put_line('no valid');
  for rec in v_list2.first ..v_list2.last loop
  dbms_output.put_line(v_list2(rec));
 end loop; 
end;

【讨论】:

但我认为,更好的解决方案是从过程而不是游标返回 2 个集合(VALID_ID)。 在第 7 行你为什么放 null ?您的代码就像魔术一样工作。请澄清,之后会接受您的答案。 这是我的错。 Null 是删除。

以上是关于如何编写一个 Oracle 过程以根据传递的数组返回两个游标的主要内容,如果未能解决你的问题,请参考以下文章

如何使用oracle程序将数据从多个表中插入一个表中

我们如何将数组从java传递到oracle中的存储过程

如何给SQLSERVER存储过程传递数组参数

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

java字符串数组作为参数传递oracle存储过程

将数组传递给 oracle 过程