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

Неявный курсор создается для инструкции SELECT, которая

·  определяется в исполняемом разделе, а не в разделе объявлений

·  содержит предложение INTO, которое является частью языка PL/SQL, а не SQL

·  не требует открытия, выборки данных и закрытия.

SELECTсписок_столбцов   [BULKCOLLECTINTOсписок_переменных

. . . оставшаяся часть инструкции SELECT

DECLARE

            l_sal   sal%ROWTYPE;

BEGIN

            SELECT  *  INTO  l_sal  FROM  sal  WHERE  snum = 1001;

END;

Инструкция SELECTINTO (без BULKCOLLECT) должна возвращать одну строку.   Oracle инициирует исключение, если

·  по запросу не найдено ни одной строки – NO_DATA_FOUND

·  возвращено несколько строк – TOO_MANY_ROWS

CREATE FUNCTION sal_name (p_SNum sal.snum%TYPE)

            RETURN sal.sname%TYPE

IS

    ret_val       sal.sname%TYPE;

BEGIN

    SELECT  sname  INTO  ret_val  FROM  sal  WHERE  snum= p_SNum;

    RETURN  ret_val;

EXCEPTION

    WHEN  NO_DATA_FOUND    THEN

        RETURN  null;

    WHEN  TOO_MANY_ROWS    THEN

Save_log (‘Нарушение целостности для snum=’|| p_SNum);

        RAISE;

END;

SQL%FOUND

TRUE, если успешно выбрана одна строка  (несколько строк для BULKCOLLECTINTO)

SQL%NOTFOUND

TRUE, если не выбрано ни одной строки (инициируется исключение NO_DATA_FOUND)

SQL%ROWCOUNT

Количество выбранных строк

SQL%ISOPEN

Всегда FALSE

2. Явные курсоры

Явный курсор – это инструкция SELECT, явно определенная в разделе объявлений как курсор. При объявлении курсору присваивается имя.

Для INSERT, UPDATE и DELETE явные курсоры создавать нельзя.

2.1. Объявление явного курсора

CURSOR  имя_курсора  [(параметр [, параметр …])]

[RETURN спецификация_return ]

    IS  инструкция_SELECT

        [ FOR UPDATE [ OF список_столбцов ] ];

·  Курсор без параметров

CURSOR  c_ord  IS

      SELECT  odate  FROM  ord;

·  Курсор с параметрами

CURSOR  c_sal (p_SNum NUMBER)  IS

      SELECT  sname  FROM  sal  WHERE  snum = p_SNum;

·  Курсор с предложением RETURN

CURSOR  c_cust  RETURN  cust%ROWTYPE  IS

      SELECT  *  FROM  cust  WHERE  city = ’London’;

Курсор не является переменной. Это идентификатор запроса. Имени курсора нельзя присвоить значение и его нельзя использовать в выражениях.