Как перебрать записи хранимой процедуры с типом SYS_REFCURSOR - PullRequest
0 голосов
/ 08 октября 2018

Я новичок в оракуле.Проблема в том, что существует существующая процедура, которая имеет следующие параметры

   P_ENTT        IN     PURCHASEORDER.POCODE%TYPE,
   P_LOCCODE     IN     LOCATION.LOCATIONCODE%TYPE,
   P_PROCESSID   IN     VARCHAR,
   V_TAXREF         OUT SYS_REFCURSOR

Я пишу новую процедуру, которая будет перебирать записи, возвращенные вышеуказанной процедурой.Я пытался использовать ключевое слово Loop, как показано ниже

FOR rec IN (OLDProcedure(Old_params))
  LOOP
     -- some calculations

  END LOOP;

, но не смог реализовать то же самое.Как перебрать возвращенные записи в этом сценарии с помощью хранимой процедуры.

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Как подразумевает @XING в ответе выше, и я сделаю это явно, вы не можете использовать курсор для цикла с переменной курсора.Таким образом, вы открываете переменную курсора, а затем используете простой цикл с явными инструкциями fetch, exit-when и close.

Но тогда вы можете спросить: почему @XING не закрывает курсор?Поскольку он объявляется локально, при завершении блока курсорная переменная автоматически закрывается механизмом PL / SQL.

Спасибо, PL / SQL!

0 голосов
/ 08 октября 2018

Перепишите вашу процедуру на основе показанного ниже блока Anonymous.Pease читать комментарии, чтобы понять.

DECLARE
  --Variable of type of your procedure `OUT` paramater
  var sys_refcursor;
 --Columns selected in your sys_refcursor query
  var1 NUMBER;
  var2 NUMBER;
  var3 NUMBER;
BEGIN
 --call your existing procedure in new procedure
 myProc( P_ENTT =>1,  V_TAXREF => var); --Pass other parameters as well
  --Loop to get your records
  LOOP
   --Fetch records of your sys_refcursor to variables
    FETCH var INTO var1,var2,var3;
    EXIT  WHEN var%notfound;
    --Display your records 
    dbms_output.put_line(var1);
  END LOOP;
END;
...