Oracle PL / SQL将游标(从函数)中的每个值逐个分配给另一个游标

时间:2017-09-05 17:31:01

标签: loops stored-procedures plsql cursor oracle12c

我有一个名为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;

2 个答案:

答案 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;