Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


SELECT ID,FIO INTO Arg1,Arg2



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; Просмотров: 574; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.054 с.)
Главная | Случайная страница | Обратная связь