Выборка данных в PL/SQL, страница 7

END;

FETCH  cv_sal1  INTO rec_sal ;

CLOSE  cv_sal1;

END;


2.8.5. Передача курсорной переменной в качестве параметра

·  Создание локального модуля внутри программы.

DECLARE

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

PROCEDURE open_query (p_CV  OUT  sal_curtype)  IS

cv_sal    sal_curtype;

BEGIN

OPEN  cv_sal  FOR  select  *  from  sal;

p_CV  :=  cv_sal;

END;

. . .

BEGIN

. . .

END;

·  Создание отдельной процедуры.

PACKAGE pack_lib  IS

TYPE sal_curtype IS REF CURSOR  RETURN sal%ROWTYPE;

END;

PROCEDURE open_query (p_CV  OUT  pack_lib.sal_curtype)  IS

cv_sal    pack_lib.sal_curtype;

BEGIN

. . .

END;


2.9. Курсорные выражения

Курсорное выражение – это выражение, включающее специальный оператор CURSOR и определяющее вложенный курсор.

  • Объявления явных курсоров
  • Объявления и переменные типа REF CURSOR
  • ДинамическиеSQL-запросы

DECLARE

CURSOR c_sal  IS

    SELECT snum, sname  FROM  sal; 

CURSOR c_ord(p_Sal NUMBER)  IS

    SELECT odate,amt FROM  ord  WHERE snum = p_Sal; 

BEGIN

FOR v_sal  IN  c_sal  LOOP

    FOR v_ord  IN  c_ord(v_sal. snum)  LOOP

        DBMS_OUTPUT.PUT_LINE

            (v_sal.sname ||' '|| v_ord.odate ||' '|| v_ord.amt);

    END LOOP;

END LOOP;

END;

DECLARE

TYPE ord_curtype IS REF CURSOR;

CURSOR c_sal_ord  IS

    SELECT s.sname,

                   CURSOR ( SELECT o.odate,o.amt FROM  ord o

                                           WHERE o.snum = s.snum)

        FROM  sal s;

ord_cur    ord_curtype;

v_name     sal.sname%TYPE;

v_date       ord.odate%TYPE;

v_sum       ord.amt%TYPE;

BEGIN

OPEN c_sal_ord;

LOOP

FETCH  c_sal_ord  INTO  v_name,  ord_cur;

EXIT  WHEN  c_sal_ord%NOTFOUND;

LOOP

FETCH  ord_cur  INTO  v_date ,v_sum;

EXIT  WHEN  ord_cur %NOTFOUND;

DBMS_OUTPUT.PUT_LINE(v_name ||' '||v_date ||' '||v_sum);

END LOOP;

END LOOP;

CLOSE c_sal_ord;

END;