我有一个名为GET_CLIENT_IN_SED的函数(返回sys_refcursor),它给出了一个id号列表(单列)。现在,在一个过程中,我试图循环遍历每个值(逐个)并使用它来调用第二个过程(它需要一个客户端id参数)。
PROCEDURE GET_ORDINARY_CLIENT;
PROCEDURE GET_ORDINARY_CLIENT_BY_SED
( sed_in IN varchar2, client_sed OUT SYS_REFCURSOR )
IS
ordinary_clients sys_refcursor;
BEGIN
ordinary_clients := GET_CLIENT_IN_SED(sed_in);
for item in ordinary_clients loop
client_sed := client_sed + ordinary_clients(i);
end loop;
END;
答案 0 :(得分:1)
遍历引用游标不像循环遍历数组或表,这解释了为什么FOR ... LOOP不起作用。
简而言之,ref_cursor不是集合,而是集合上的“指针”或“迭代器”。在另一个问题中,您将找到一个使用FETCH迭代ref_cursor的非常明确的示例。
How to use record to loop a ref cursor?
您的数据示例如下所示:
PROCEDURE GET_ORDINARY_CLIENT_BY_SED(sed_in IN VARCHAR2,
client_sed OUT SYS_REFCURSOR) IS
ordinary_clients SYS_REFCURSOR;
clt NUMBER; -- assuming your cursor contains strictly numbers
BEGIN
ordinary_clients := GET_CLIENT_IN_SED(sed_in);
LOOP
FETCH ordinary_clients
INTO clt;
EXIT WHEN ordinary_clients%NOTFOUND;
dbms_output.put_line(clt);
-- do some other things here with your number
END LOOP;
END;
答案 1 :(得分:1)
据我所知,你需要做的事情如下:
<强>功能:强>
此函数将输入作为数字并返回refcursor。与您的要求相似。
CREATE OR REPLACE FUNCTION get_num_sysrefcur (num IN NUMBER)
RETURN SYS_REFCURSOR
AS
my_cursor SYS_REFCURSOR;
BEGIN
--
OPEN my_cursor FOR
WITH ntable
AS (SELECT 1 ID, 111 AGT, 'ABC' DESCRIP FROM DUAL
UNION ALL
SELECT 2 ID, 222 AGT, 'ABC' DESCRIP FROM DUAL
UNION ALL
SELECT 1 ID, 333 AGT, 'ABC' DESCRIP FROM DUAL)
SELECT AGT FROM ntable WHERE ID = num;
RETURN my_cursor;
END;
/
阻止(在您的案例中为程序) - 这个匿名块将循环遍历sys_refcursor返回的记录。您需要在第二个过程中使用sys_refcursor的值并将其循环(您可以创建过程来代替此匿名块)。
DECLARE
a NUMBER := 1;
TYPE ta IS TABLE OF NUMBER
INDEX BY PLS_INTEGER;
b ta;
x SYS_REFCURSOR;
BEGIN
x := get_num_sysrefcur (a);
fetch x bulk collect into b;
for i in 1..b.count
loop
-- Displaying the result of the ref_cursor.
DBMS_OUTPUT.put_line (b(i));
end loop;
END;