Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
SELECT ID,FIO INTO Arg1,Arg2 ⇐ ПредыдущаяСтр 5 из 5
6 FROM GRUP236 WHERE ID=1; 7 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg1) ||’'||Arg2); 8 END; 9 / Alijalin Denis Urievich SQL> DECLARE 2 Arg1 NUMBER; 3 Arg2 VARCHAR2(30); BEGIN SELECT ID, FIO INTO Arg1, Arg2 FROM GRUP236 6 WHERE ID=4; 7 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Argl) I I '' I IArg2); 8 END; 9 / ERROR at line 1: ORA-01403: no data found ORA-06512: at line 5 SQL> DECLARE 2 Arg1 NUMBER; 3 Arg2 VARCHAR2(30); BEGIN 5 SELECT ID, FIO INTO Arg1, Arg2 FROM GRUP236 6 WHERE ID IN (1, 2); 7 DBMS_OUTPUT.PUT_LINE(TO_CHAR(Arg1) | | " | |Arg2); 8 END; 9 / ERROR at line 1: ORA-01422: exact fetch returns more than requested Number of rows ORA-06512: at line 5 Листинг 23. Пример программы на PL/SQL, осуществляющей выборку данных с использованием неявного курсора
Курсорный цикл FOR — это синтаксическая конструкция, которая позволяет использовать курсор в пределах цикла. Обычно он используется, когда обрабатывается каждая возвращаемая строка. Курсор объявляется в секции DECLARE с помощью ключевого слова CURSOR. Обратите внимание, в следующем примере переменная vl, в которую в цикле выбираются данные, не требует объявления.
SQL> DECLARE 2 CURSOR Cur1 IS SELECT ID, FIO FROM GRUP236; 3 v1 VARCHAR2(4000); BEGIN FOR rec IN Cur1 LOOP 6 v1: =LTRIM(v1||' ’||rec.FIO); 7 END LOOP; 8 DBMS_OUTPUT.PUT_LINE(v1); 9 END; 10 / Alijalin Denis Urievich Anshukov Anton Olegovich Bagenov Petr Igorevich PL/SQL procedure successfully completed. Листинг 24. Пример программы на PL/SQL, осуществляющей выборку данных с использованием курсорного цикла FOR
Простейший вариант курсорного цикла FOR представляет собой запрос, встроенный в описание цикла:
SQL> DECLARE 2 v1 VARCHAR2(4000); BEGIN FOR rec IN (SELECT ID, FIO FROM GRUP236) LOOP 5 v1: =LTRIM(v1||' '||rec.FIO); 6 END LOOP; 7 DBMS_OUTPUT.PUT_LINE(v1); 8 END; 9 / Alijalin Denis Urievich Anshukov Anton Olegovich Bagenov Petr Igorevich PL/SQL procedure successfully completed. Листинг 25. Пример программы на PL/SQL, осуществляющей выборку данных с использованием запроса, встроенного в описание цикла
Рассмотрим пример выборки данных с использованием явных курсоров. Объявим курсор Cur1, ориентированный на получение данных из таблицы GRUP236: CURSOR Curl IS SELECT * FROM GRUP236. Первым шагом, необходимым для работы с курсором, является открытие курсора, которое выполняется командой: OPEN Cur1; Выборка данных из курсора может быть выполнена в набор переменных подходящих типов, командой FETCH, например, таким образом: FETCH Cur1 INTO Arg1, Arg2; Самый простой путь определить набор переменных, в которые планируется выборка данных из курсора - - объявить переменную типа RECORD, основанную на типе курсора. В этом случае если выражение SELECT изменяется, то поля этой переменной также изменяются, но уже автоматически. Полностью процедура получения данных из таблицы GRUP236 выглядит следующим образом:
SQL> DECLARE 2 Cursor Cur1 IS SELECT * FROM GRUP236; 3 Rec Cur1%ROWTYPE; BEGIN OPEN Cur1; — Курсор должен быть открыт FOR I IN 1..3 LOOP 7 FETCH Cur1 INTO rec; 8 DBMS_OUTPUT.PUT_LINE(TO_CHAR(rec.ID)||’ ’||rec.FIO); . 9 END LOOP; 10 END; 11 / Alijalin Denis Urievich Anshukov Anton Olegovich Bagenov Petr Igorevich PL/SQL procedure successfully completed. Листинг 26. Пример программы на PL/SQL, осуществляющей выборку данных с использованием явного курсора
Программа, представленная в листинге 26, неудачна тем, что цикл настроен на получение конкретного числа строк, которых может и не быть в таблице. В PL/SQL для курсоров предусмотрены специальные методы %NOTFOUND и %FOUND, принимающих противоположные булевские значения. Метод %NOTFOUND возвращает значения TRUE если выборка в курсор пустая, то есть не содержит строки. Обратите внимание, что после открытия курсора, но до первой команды FETCH, методы %FOUND и %NOTFOUND принимают неопределенное значение (UNKNOWN). Незнание этого факта может привести к достаточно распространенной ошибке. При организации цикла с использованием оператора WHILE и выполнением проверки на истинность %FOUND на входе цикл не будет выполнен ни разу, несмотря на наличие данных, удовлетворяющих запросу. Метод %ROWCOUNT возвращает число строк, выбранных после открытия курсора. При объявлении переменных также можно использовать специальные атрибуты %TYPE и %ROWTYPE. Атрибут %TYPE предназначен для определения типа данных переменной, константы или столбца. Этот атрибут обычно применяется при объявлении переменной с типом данных, зависящим от определения столбца в таблице базы данных. Атрибут %ROWTYPE обычно применяется, когда объявляется переменная-запись, которая должна иметь такую же структуру, что и строка в таблице или представлении, или запись, извлекаемая из курсора. Использование атрибутов %TYPE и %ROWTYPE предохраняет от возможных ошибок при изменении типов данных столбцов таблиц или структуры самих таблиц. С учетом дополнительных объектов и методов PL/SQL рассмотрим новый вариант программы выборки строк таблицы GRUP236 с использованием курсоров. Обратите внимание на повторный вывод последней строки. Попытайтесь исправить организацию цикла для устранения повторного вывода.
SQL> declare 2 TYPE GRUP236_rec_type IS RECORD 3 (Arg1 GRUP236.ID%TYPE, - переменная типа атрибута ID таблицы GRUP236 4 Arg2 GRUP236.FIO%TYPE, - переменная типа атрибута FIO таблицы GRUP236 5 Arg3 GRUP236.dolgnost%TYPE, - переменная типа атрибута DOLGNOST таблицы GRUP236 6 Arg4 GRUP236.zvanie%TYPE, - переменная типа атрибута ZVANIE таблицы GRUP236 7 Arg5 GRUP236.oklad%TYPE); - переменная типа атрибута OKLAD таблицы GRUP236 8 GRUP236_rec GRUP236_rec_type; 9 Cursor Cur1 IS SELECT * FROM GRUP236; Begin 11 open cur1; LOOP 13 EXIT WHEN (Cur1%NOTFOUND); 14 FETCH Cur1 INTO GRUP236_rec; 15 DBMS_OUTPUT.PUT_LINE(Cur1%ROWCOUNT||' '||GRUP236_rec.Arg2||' '||grup236_rec.Arg3||' '||grup236_rec.arg4||' '||grup236_rec.arg5); 16 END LOOP; 17 END; 18 / Alijalin Denis Urievich ryadovoi kursant 3000 Anshukov Anton Olegovich ryadovoi efreitor 3100 Bagenov Petr Igorevich ryadovoi efreitor 3100 Bardashev Aleksei Andreevich ryadovoi kursant 3000 Danchenco Maksim Nikolaevich ryadovoi kursant 3000 Jigulin Petr Evgenievich comandir otdelenija serjant 3300 Jigulin Petr Evgenievich comandir otdelenija serjant 3300 PL/SQL procedure successfully completed. Листинг 27. Пример модифицированной программы, осуществляющей выборку данных с использованием, курсора
Объявление курсора может содержать параметрический запрос. Значения параметров задаются при открытии курсора. Имя параметра должно отличаться от имени столбца в запросе курсора. В противном случае будет возвращена каждая строка! (х = х всегда TRUE). Рассмотрим пример выборки данных с параметрическим запросом. В листинге 28 приведен пример с использованием параметрического курсора и измененной организацией цикла, исключающей повторный вывод последней строки.
SQL> declare 2 TYPE GRUP236_rec_type IS RECORD 3 (Arg1 GRUP236.ID%TYPE, 4 Arg2 GRUP236.FIO%TYPE, 5 Arg3 GRUP236.dolgnost%TYPE, 6 Arg4 GRUP236.zvanie%TYPE, 7 Arg5 GRUP236.oklad%TYPE); 8 GRUP236_rec GRUP236_rec_type; 9 Cursor Cur2 (I NUMBER) IS SELECT * FROM GRUP236 10 WHERE MOD (ID, i) = 1; Begin 12 OPEN Cur2(2); 13 FETCH Cur2 INTO GRUP236_rec; 14 WHILE Cur2%found loop 15 DBMS_OUTPUT.PUT_LINE(Cur2%ROWCOUNT||' '||GRUP236_rec.Arg2||' '||grup236_rec.Arg3||' '||grup236 _rec.arg4||' '||grup236_rec.arg5); 16 FETCH Cur2 INTO GRUP236_rec; 17 end loop; 18 end; 19 / Alijalin Denis Urievich ryadovoi kursant 3000 Bagenov Petr Igorevich ryadovoi efreitor 3100 Jigulin Petr Evgenievich comandir otdelenija serjant 3300 PL/SQL procedure successfully completed. Листинг 28. Пример программы на PL/SQL, осуществляющей выборку данных с использованием параметрического курсора.
Для работы с явными курсорами может использоваться конструкция REF — ссылка на курсор. Сначала объявляется ссылка на курсор, а описание курсора производится потом. Как правило, ссылки на курсор применяются, когда запрос для курсора формируется динамически. Пример работы REF-ссылки приведен в листинге 29.
SQL> declare 2 TYPE cursor_type IS REF CURSOR; 3 Cur1 cursor_type; 4 l_query VARCHAR2(100); 5 rec GRUP236%ROWTYPE; BEGIN 7 l_query: ='SELECT * FROM GRUP236'; 8 l_query: = l_query||' WHERE ID=1'; 9 OPEN Cur1 FOR l_query; 10 FETCH Cur1 INTO rec; 11 DBMS_OUTPUT.PUT_LINE(rec.ID||' '||rec.ID); 12 close cur1; 13 end; 14 / PL/SQL procedure successfully completed. Листинг 29. Пример программы на PL/SQL, осуществляющей выборку данных с использованием ссылки на курсор
СОДЕРЖАНИЕ РУКОВОДСТВО по работе с языком PL/SQL.. 1 1.ОБЩАЯ ХАРАКТЕРИСТИКА SQL.. 2 1.1 Основные объекты Oracle. 2 1.2 Организация запросов на языке SQL.. 6 1.2.1 Структура запроса. 6 1.2.2 Простейшие запросы.. 6 1.2.3 Формирование критерия отбора. 8 1.2.4 Базовые средства определения критерия отбора. 9 1.3 PL/SQL — процедурное расширение языка SQL.. 12 1.4 Структура программы на PL/SQL.. 12 1.5 Использование инструментального средства SQL*Plus. 14 1.6 Информация о результатах выполнения операции. 17 2. ТИПЫ ДАННЫХ ORACLE.. 19 2.1 Строки символов. 19 2.2 Числовые типы.. 20 2.3 Битовые строк. 22 2.4 Дата и время. 23 2.5 LOB-объекты.. 24 3. УПРАВЛЕНИЕ ВЫПОЛНЕНИЕМ ПРОГРАММ... 25 3.1 Оператор ветвления. 33 3.2 Операторы цикла. 33 3.3 Оператор GOTO.. 33 4. КУРСОРЫ... 33 5. СОЗДАНИЕ ПОЛЬЗОВАТЕЛЬСКИХ ПРОЦЕДУР И ФУНКЦИЙ.. 25 6. ТРИГГЕРЫ БАЗЫ ДАННЫХ.. 29 СОДЕРЖАНИЕ.. 33
Популярное:
|
Последнее изменение этой страницы: 2016-07-14; Просмотров: 616; Нарушение авторского права страницы