如何编写一个 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 过程以根据传递的数组返回两个游标的主要内容,如果未能解决你的问题,请参考以下文章