Извлечение данных из курсора в PL/SQL Oracle
После того, как курсор объявлен и открыт, каждая строка становится доступной по отдельности с помощью оператора FETCH. В этом операторе указывается, что именно нужно извлечь (столбцы), а также место для хранения извлечённых данных. Кроме того, оператор FETCH автоматически перемещает внутренний указать на строки в пределах курсора для извлечения следующей, а не одной и той же строки снова и снова.
Практический пример
Рассмотрим работу курсора c_vendors. Обратите внимание, что курсор начинается с оператора DECLARE, на этот раз в нём объявляется не только курсор, но и переменные, в которых требуется хранить данные. Эти переменные объявляются очень просто: сначала они именуются, а затем связываются с отдельными столбцами таблицы.
Далее определяется сам курсор c_vendors, а затем он открывается при помощи OPEN. Далее появляется оператор LOOP, который определяет блок циклически повторяющегося кода. Код, который расположен между LOOP и END LOOP, повторно выполняется до тех пор, пока не возникнет условие, вынуждающее выйти из цикла.
В этом цикле одна строка извлекается из курсора в указанные переменные с помощью оператора FETCH. Обратите внимание, что имена столбцов в этом операторе не указаны, и поэтому очень важен порядок следования столбцов. То есть, содержимое первого столбца будет сохранено в первой переменной, содержимое второго столбца во второй и т.д.
Оператор FETCH извлекает строки по очереди, и поэтому на каждом шаге цикла извлекается новая строка, а переменные обновляются новыми значениями из этой строки.
Чтобы прекратить этот цикл, используется оператор EXIT, который осуществляет выход из цикла и прекращает обработку данных в нём. Оператором EXIT можно воспользоваться в любом месте кода.
В нашем примере оператор EXIT WHEN c_vendors%notfound; расположен в конце цикла, указывая Oracle выйти из цикла, когда курсор c_vendors возвратит состояние notfound, указывающее на то, что извлекаемых строк больше не осталось.
DECLARE - Объявление переменных v_vend_id vendors.vend_id%TYPE; v_vend_name vendors.vend_name%TYPE; v_vend_address vendors.vend_address%TYPE; -- Объявление курсора CURSOR c_vendors IS SELECT vend_id, vend_name, vend_address FROM vendors; BEGIN -- Открываем курсор OPEN c_vendors; - Перебираем курсор в цикле LOOP -- Получаем строку FETCH c_vendors INTO v_vend_id, v_vend_name, v_vend_address -- Выходим из цикла, если извлекаемых строк больше не осталось EXIT WHEN c_vendors%notfound; END LOOP; - Закрываем курсор CLOSE c_vendors; END;