Скачать презентацию Извлечение данных с помощью курсоров Коллекции Учебный центр Скачать презентацию Извлечение данных с помощью курсоров Коллекции Учебный центр

Oracle_Лекция3.pptx

  • Количество слайдов: 51

Извлечение данных с помощью курсоров. Коллекции. Учебный центр информационных технологий «Информатика» 2013 Извлечение данных с помощью курсоров. Коллекции. Учебный центр информационных технологий «Информатика» 2013

Содержание лекции № 3: Выборка данных. Записи и коллекции. Правила работы с курсорами и Содержание лекции № 3: Выборка данных. Записи и коллекции. Правила работы с курсорами и варианты их использования. Явные и неявные курсоры.

Стандартные пакеты. DBMS_OUTPUT Этот пакет предназначен для вывода информации во временный буфер, чтобы можно Стандартные пакеты. DBMS_OUTPUT Этот пакет предназначен для вывода информации во временный буфер, чтобы можно было выбрать ее позже. Обычно его используют для отладки. Включение пакета: dbms_output. enable dbms_output. disable Процедуры пакета: procedure put_line procedure new_line procedure get_line

Процедуры пакета DBMS_OUTPUT procedure put (a varchar 2) – процедурой помещается строка в буфер Процедуры пакета DBMS_OUTPUT procedure put (a varchar 2) – процедурой помещается строка в буфер без перевода строки. Данные типа number, date будут преобразованы функцией to_char с использованием форматов по умолчанию. procedure put_line(a varchar 2) – тоже, что и put, только проставляется конец строки. procedure new_line – процедура проставляет конец строки procedure get_line(line out varchar 2, status out integer) выбирает строку из буфера. status – принимает значение 0 ( выборка успешна), 1 (строк для выборки в буфере не осталось). Line – содержание строки. procedure get_lines(lines out dbmsoutput_linesarray, numlines in out integer); выбирает строки из буфера. Numlines – количество выбранных строчек. Lines – содержание буфера. В процедурах get_line, put первый параметр - это переменная, из которой или в которую считываются данные.

Каждая сессия имеет свой буфер, который содержится в SGA. Вся информация, что выдается процедурами Каждая сессия имеет свой буфер, который содержится в SGA. Вся информация, что выдается процедурами put_line и put помещается в этот буфер. dbms_output. enable(buffer_size in integer default 20000) – процедура включает (активизирует) выдачу информации в буфер и устанавливает размер буфера(The maximum size is 1, 000, the minimum is 2000). dbms_output. disable – процедура для выключения выдачи в буфер. BEGIN DBMS_OUTPUT. PUT_LINE (‘Привет'); END; или exec dbms_output. put_line(‘Привет');

Oracle. Перечень основных команд DDL - Data Definition Language (язык описания данных) DML - Oracle. Перечень основных команд DDL - Data Definition Language (язык описания данных) DML - Data Manipulation Language (язык управления (манипулирования) данными) DCL - Data Control Language (язык баз данных для осуществления административных функций)).

Посмотреть структуру таблицы: DESC имя_таблицы Создать таблицу table 1: CREATE TABLE table 1 ( Посмотреть структуру таблицы: DESC имя_таблицы Создать таблицу table 1: CREATE TABLE table 1 ( field 1 VARCHAR 2(25) NOT NULL, field 2 NUMBER(4, 2) NOT NULL, field 3 DATE ); Вставить данные в таблицу table 1: INSERT INTO table 1 VALUES (‘Data 1′, 1, ’ 5 -NOV 2000′); INSERT INTO table 1 VALUES (‘Data 2′, 2. 5, ’ 29 JUN-2001′); INSERT INTO table 1 VALUES (‘Data 3′, 50. 75, ’ 10 DEC-2002′); INSERT INTO table 1 VALUES (‘Data 4′, 1, NULL);

Вставить данные в таблицу table 1: INSERT INTO table 1 VALUES (‘Data 1′, 1, Вставить данные в таблицу table 1: INSERT INTO table 1 VALUES (‘Data 1′, 1, ’ 5 -NOV 2000′); INSERT INTO table 1 VALUES (‘Data 2′, 2. 5, ’ 29 JUN-2001′); INSERT INTO table 1 VALUES (‘Data 3′, 50. 75, ’ 10 DEC-2002′); INSERT INTO table 1 VALUES (‘Data 4′, 1, NULL); Выбрать все поля (столбцы) из таблицы table 1: SELECT * FROM table 1; Выбрать некоторые поля из таблицы table 1: SELECT field 1, field 2 FROM table 1;

Выбрать некоторые поля из таблицы table 1: SELECT field 1, field 2 FROM table Выбрать некоторые поля из таблицы table 1: SELECT field 1, field 2 FROM table 1; Выбрать поля из таблицы table 1 с условием: SELECT столбцы FROM имя_таблицы WHERE условие(я); Отсортировать по отдельным столбцам: SELECT * FROM имя_таблицы ORDER BY столбец_сортировки ASC или DESC;

Изменить данные в таблице table 1: UPDATE имя_таблицы SET имя_столбца = новое_значение WHERE условие; Изменить данные в таблице table 1: UPDATE имя_таблицы SET имя_столбца = новое_значение WHERE условие; Удаление записей из таблицы table 1: DELETE FROM имя_таблщы WHERE условие; Удаление всех записей таблицы: DELETE FROM имя_таблщы WHERE условие; или TRUNCATE TABLE имя_таблицы;

Откат одной и более транзакций: ROLLBACK TO имя_точки _отката; Откат в предварительно установленную точку: Откат одной и более транзакций: ROLLBACK TO имя_точки _отката; Откат в предварительно установленную точку: SAVEPOINT имя_точки_сохранения; Сохранение изменеий в базе данных COMMIT

Объявления с привязкой Anchored declaration – объявление переменных с привязкой используется если переменной требуется Объявления с привязкой Anchored declaration – объявление переменных с привязкой используется если переменной требуется присвоить значение из другого источника данных, например из строки таблицы. Переменной устанавливается тип данных, который соответствует уже определённой структуре данных. Типы привязок: Скалярная привязка. С помощью атрибута %TYPE переменная определяется на основе типа столбца таблицы или другой скалярной переменной PL/SQL. Привязка к записи. Используя атрибут %ROWTYPE, можно определить переменную на основе таблицы или предопределённого явного курсора PL/SQL. Синтаксис: имя_переменной тип_атрибута%TYPE [значение по умолчанию]; имя_переменной имя_таблицы | имя_курсора %TYPE [значение по умолчанию];

Использование атрибута %TYPE DECLARE v_emp_id empno%TYPE; Словарь данных Имя столбца Тип empno ename v_new_emp Использование атрибута %TYPE DECLARE v_emp_id empno%TYPE; Словарь данных Имя столбца Тип empno ename v_new_emp emo_id%TYPE; BEGIN … END; NUMBER VARCHAR 2(30) hiredate DATE

Записи и коллекции в PL/SQL Данные могут храниться и обрабатываться в программах как в Записи и коллекции в PL/SQL Данные могут храниться и обрабатываться в программах как в виде отдельных скалярных значений, так и в виде структур, состоящих из нескольких элементов с отдельными значениями. Записи и коллекции являются составными структурами данных. Записи в PL/SQL очень похожи на строки в таблицах. Запись как целое не имеет собственное значение; однако значение имеет каждый её компонент или поле, а объединение их в единую запись позволяет хранить и обрабатывать все значения как одно целое. Коллекция – это структура данных, похожая на одномерный массив. Они используются для управления списками информации.

Записи в PL/SQL Запись – это высокоуровневое средство адресации и обработки данных, определённых внутри Записи в PL/SQL Запись – это высокоуровневое средство адресации и обработки данных, определённых внутри программ PL/SQL. Абстракция данных. Для того чтобы создать запись нужно выделить атрибуты или поля описываемого ею объекта. Получившийся набор атрибутов, связанных определённым отношением будет являться записью. Агрегатные операции. Организация информации в виде записей позволяет выполнять операции не только над их отдельными атрибутами, но и над записью как единым целым. Компактность и простота кода. Использование записей позволяет программисту писать более понятный и компактный код, содержащий меньше комментариев и объявлений переменных.

Использование записей Создавайте записи соответствующие курсорам. Создавая в программе курсор, тут же добавьте соответствующую Использование записей Создавайте записи соответствующие курсорам. Создавая в программе курсор, тут же добавьте соответствующую запись(з исключением курсора цикла FOR). Данные из курсора следует извлекать в запись, а не в отдельную переменную. Создавайте записи на основе таблиц. Если в программе должны храниться данные полученные из таблицы, создайте запись на базе таблицы. Старайтесь свести к минимуму количество переменных и динамически связывайте структуры данных программы со структурами данных РСУБД при помощи атрибута %ROWTYPE. Передавайте записи в качестве параметров. Вызываемым процедурам по возможности передавайте не отдельные переменные, а целые записи. Тем самым вы уменьшите вероятность изменения синтаксиса процедуры. Существует три способа объявления записей.

Запись на основе курсора Запись объявляется на основе явно заданного курсора, представленного переменной, где Запись на основе курсора Запись объявляется на основе явно заданного курсора, представленного переменной, где каждое поле соответствует столбцу или именованному выражению в инструкции SELECT при помощи атрибута %ROWTYPE. Пример: DECLARE CURSOR cur_my_books IS SELECT * FROM books WHERE author LIKE ‘%Достоевский%’; one_book cur_my_book%ROWTYPE; BEGIN … END;

Запись на основе таблицы Запись объявляется на основе таблицы при помощи атрибута %ROWTYPE и Запись на основе таблицы Запись объявляется на основе таблицы при помощи атрибута %ROWTYPE и каждое поле записи будет соответствовать одноимённому столбцу таблицы. Явное объявление записи DECLARE one_books%ROWTYPE; BEGIN … END: Неявное объявление записи DECLARE BEGIN FOR booc_rec IN (SELECT * FROM books) LOOP calculate_total_sales(book_rec); END LOOP; END:

Запись определённая пользователем Можно создать запись только с нужными аргументами, явно определив каждое поле Запись определённая пользователем Можно создать запись только с нужными аргументами, явно определив каждое поле записи. DECLARE TYPE book_info_rt IS RECORD ( author books. author%TYPE, category VARCHAR 2(100), total_page_count NUMBER); steven_as_author book_info_rt; BEGIN … END:

Вложенные записи PL/SQL позволяет создать структуры вложенных записей, в этой структуре одно из полей Вложенные записи PL/SQL позволяет создать структуры вложенных записей, в этой структуре одно из полей внешней записи представляет собой отдельную запись. DECLARE TYPE phone_rectype IS RECORD ( intl_prefix VARCHAR 2(2), area_code VARCHAR 2(3), exchange VARCHAR 2(4), phn_number VARCHAR 2(4) ); TYPE contact_set_rectype IS RECORD (day_phone# phone_rectype, fax_phone# phone_rectype, home_phone# phone_rectype ); auth_rep_info_rec contact_set_rectype; BEGIN auth_rep_info_rec. fax_phone#. area_code: =auth_rep_info_rec. home_phone#. area_code END;

Коллекции в PL/SQL Коллекция – это составной тип данных, предназначенных для хранения одномерных массивов Коллекции в PL/SQL Коллекция – это составной тип данных, предназначенных для хранения одномерных массивов с однотипными элементами в программах PL/SQL или столбцах базы данных. Операции для которых можно использовать коллекции Эмуляция двунапрвленных курсоров и курсоров с произвольным доступом. Если загрузить строки курсора в коллекцию, то можно перемещаться между записями и обращаться к каждой строке курсора произвольное количество раз Хранение списков подчинённой информации непосредственно в столбцах таблицы – в виде вложенной таблицы или массива VARRAY. Отслеживание элементов данных, отобранных в программе для специальной обработки. Кэширование статичной информации базы данных, которая часто указывается в запросах (коллекции позволяют повысить быстродействие запросов).

Типы коллекций Ассоциативные массивы – это одномерные, разреженные, неограниченные коллекции, которые можно обработать только Типы коллекций Ассоциативные массивы – это одномерные, разреженные, неограниченные коллекции, которые можно обработать только в PL/SQL. Для индексирования содержимого массива можно использовать VARCHAR 2 или PLS_INTEGER. *Associative array (or index-by table) Вложенные таблицы – одномерные, несвязанные коллекции, состоящие из однородных элементов. Их можно определять и в PL/SQL и в базе данных, например в качестве столбцов. Из за удаления некоторых элементов могут стать разреженными. *Nested table Массив типа VARRAY – Это одномерные массивы переменной длины состоящие из однородных элементов. Могут использоваться и в PL/SQL и в базах данных. Эти массивы (в отличии от предыдущих) не могут быть разреженными. *Variable-size array (varray)

Пример создания коллекции --Вложенная таблица DECLARE TYPE list_of_dates_t IS TABLE OF DATE; TYPE list_of_names_t Пример создания коллекции --Вложенная таблица DECLARE TYPE list_of_dates_t IS TABLE OF DATE; TYPE list_of_names_t IS TABLE OF VARCHAR 2 (100) INDEX BY BINARY_INTEGER; birthdays list_of_dates_t: =list_of_dates_t(); --Ассоциативный массив happyfamily list_of_names_t; BEGIN birthdays. EXTEND; birthdays(1): =’ 23. 09. 1985’; birthdays. EXTEND; birthdays(2): =’ 09. 04. 1978’; happyfamily(-15070): =‘Иван’; happyfamily(88): =‘Ева’; happyfamily(909): =‘Женя’; happyfamily(202020): =‘Таня’; DBMS_OUTPUT. put_line (birthdays. COUNT); DBMS_OUTPUT. put_line (happyfamily. FIRST); END; 2 -15070

Встроенные методы коллекций Метод Описание Функция COUNT Возвращает текущее количество эленментов Процедура DELETE Удаляет Встроенные методы коллекций Метод Описание Функция COUNT Возвращает текущее количество эленментов Процедура DELETE Удаляет из вложенной таблицы один или несколько элементов Процедура EXTEND Увеличивает колличество элементов в коллекции Функция EXIST Возвращает значение TRUE или FALSE, определяющее, существует ли в коллекции заданный элемент Функция FIRST и LAST Возвращает индексы первого и последнего элемента в коллекции Функция LIMIT Возвращает максимальное количество элементов в массиве VARRAY Функция PRIOR, NEXT Возвращает индексы элементов предшествующих заданному и следующему за ним Функция TRIM Удаляет элементы начиная с конца коллекции (count уменьшается)

Пример перебора элементов коллекции DECLARE TYPE population IS TABLE OF NUMBER INDEX BY VARCHAR Пример перебора элементов коллекции DECLARE TYPE population IS TABLE OF NUMBER INDEX BY VARCHAR 2(64); city_population; i VARCHAR 2(64); BEGIN city_population(‘Бердск') : = 100259; city_population(‘Омск') : = 1160670; city_population(‘Новосибирск') : = 1473754; city_population(‘Бердск') : = 100260; i : = city_population. FIRST; WHILE i IS NOT NULL LOOP DBMS_Output. PUT_LINE (‘Население в ' || i || ‘е составляет ' ||TO_CHAR(city_population(i))); i : = city_population. NEXT(i); END LOOP; END; Население в Бердске 100260 Население в Новосибирске 1473754 Население в Омске 1473754

Объявление вложенной таблицы или типа VARRAY Перед объявлением вложенной таблицы или VARRAY, также как Объявление вложенной таблицы или типа VARRAY Перед объявлением вложенной таблицы или VARRAY, также как и при объявлении ассоциативного массива, нужно объявить соответствующий тип. Его можно задать либо в базе данных, либо в блоке PL/SQL. Создание типа вложенной таблицы в базе данных: Create [or replace] TYPE имя_типа AS|IS TABLE OF тип_данных_элемента [NOT NULL]; Создание типа VARRAY в базе данных: Create [or replace] TYPE имя_типа AS|IS VARRAY(максимальный индекс) OF тип_данных_элемента [NOT NULL]; Для удаления любого типа данных, необходимо выполнить команду: DROP TYPE имя_типа [FORCE];

Объявление вложенных таблиц или VARRAY в PL/SQL Создание типа вложенной таблицы в PL/SQL: TYPE Объявление вложенных таблиц или VARRAY в PL/SQL Создание типа вложенной таблицы в PL/SQL: TYPE имя_типа AS|IS TABLE OF тип_данных_элемента [NOT NULL]; Создание типа VARRAY в PL/SQL: TYPE имя_типа AS|IS VARRAY(максимальный индекс) OF тип_данных_элемента [NOT NULL];

Пример использования вложенной таблицы 1. Создаём тип typ_color в базе данных: CREATE OR REPLACE Пример использования вложенной таблицы 1. Создаём тип typ_color в базе данных: CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); 2. Создаём анонимный блок в котором мы будем использовать тип typ_color: DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); BEGIN for i in 1. . v_font_colors. count loop DBMS_Output. PUT_LINE(v_font_colors(i)); end loop; END; Зелёный Синий Голубой

Мультимножество MULTISET EXCEPT MULTISET UNION MULTISET INTERSECT Уникальное множество MULTISET UNION DISTINCT Мультимножество MULTISET EXCEPT MULTISET UNION MULTISET INTERSECT Уникальное множество MULTISET UNION DISTINCT

Оператор MULTISET UNION CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE Оператор MULTISET UNION CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 typ_color: =typ_color(); BEGIN v_font_colors 3: =v_font_colors MULTISET UNION v_font_colors 2 ; for i in 1. . v_font_colors 3. count loop DBMS_Output. PUT_LINE(v_font_colors 3(i)); end loop; END; Зелёный Синий Голубой Красный Синий Голубой

Оператор MULTISET UNION DISTINCT CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); Оператор MULTISET UNION DISTINCT CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 typ_color: =typ_color(); BEGIN v_font_colors 3: =v_font_colors MULTISET UNION DISTINCT v_font_colors 2 ; for i in 1. . v_font_colors 3. count loop DBMS_Output. PUT_LINE(v_font_colors 3(i)); end loop; END; Зелёный Синий Голубой Красный

Оператор MULTISET INTERSECT DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', Оператор MULTISET INTERSECT DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 typ_color: =typ_color(); BEGIN v_font_colors 3: =v_font_colors MULTISET INTERSECT v_font_colors 2 ; for i in 1. . v_font_colors 3. count loop DBMS_Output. PUT_LINE(v_font_colors 3(i)); end loop; END; Синий Голубой

Оператор MULTISET EXCEPT CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE Оператор MULTISET EXCEPT CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 typ_color: =typ_color(); BEGIN v_font_colors 3: =v_font_colors MULTISET EXCEPT v_font_colors 2 ; for i in 1. . v_font_colors 3. count loop DBMS_Output. PUT_LINE(v_font_colors 3(i)); end loop; END; Зелёный

Использование коллекций Коллекции можно использовать как компоненты записи. CREATE OR REPLACE TYPE typ_color AS Использование коллекций Коллекции можно использовать как компоненты записи. CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); DECLARE( TYPE toys is RECORD (form NUMBER, weight NUMBER, color typ_color );

 Коллекцию можно передавать в качестве параметров в программу CREATE OR REPLACE TYPE typ_color Коллекцию можно передавать в качестве параметров в программу CREATE OR REPLACE TYPE typ_color AS TABLE OF VARCHAR 2(30); CREATE OR REPLACE PROCEDURE make_colors_superset(first_colors IN typ_color, Second_colors IN typ_color, superset OUT typ_color, type_multiset IN NUMBER) as Begin IF type_multiset=1 then superset : =first_colors MULTISET UNION second_colors ; ELSIF type_multiset=2 then superset : =first_colors MULTISET INTERSECT Second_colors ; ELSIF type_multiset=3 then superset : =first_colors MULTISET EXCEPT Second_colors ; ELSE superset : =first_colors MULTISET UNION DISTINCT Second_colors; END IF; End;

DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 DECLARE v_font_colors typ_color: =typ_color('Зелёный', 'Синий', 'Голубой'); v_font_colors 2 typ_color: =typ_color('Красный', 'Синий', 'Голубой'); v_font_colors 3 typ_color: =typ_color(); BEGIN make_colors_superset(v_font_colors , v_font_colors 2, v_font_colors 3, 1) ; for i in 1. . v_font_colors 3. count loop DBMS_Output. PUT_LINE(v_font_colors 3(i)); end loop; END; Зелёный Синий Голубой Красный Синий Голубой

Выборка данных Одной из важнейших характеристик PL/SQL является тесная интеграция с базой данных ORACLE Выборка данных Одной из важнейших характеристик PL/SQL является тесная интеграция с базой данных ORACLE как в отношении изменения данных в таблицах, так и в отношении выборки информации из таблиц. Когда SQL инструкция выполняется из PL/SQL, СУБД ORACLE назначает ей приватную рабочую область, а некоторые данные записывает в системную глобальную область. PL/SQL предоставляет программистам несколько механизмов доступа к этой рабочей области и содержащейся в ней информации.

Механизмы доступа к данных из PL/SQL Неявные курсоры. Инструкция SELECT. . INTO считывает одну Механизмы доступа к данных из PL/SQL Неявные курсоры. Инструкция SELECT. . INTO считывает одну строку данных и присваивает её в качестве переменной программы. Явные курсоры. Запрос можно явно объявить как курсор в разделе объявления локального блока или пакета. После этого такой курсор можно открывать и выбирать из него данные. Курсорные переменные. Это переменные с типом REF CURSOR, позволяют передавать из программы в программу указатель на результирующий набор строк.

Работа с неявными курсорами Неявный курсор это инструкция SELECT обладающая следующими характеристиками: Эта инструкция Работа с неявными курсорами Неявный курсор это инструкция SELECT обладающая следующими характеристиками: Эта инструкция определяется в исполняемом разделе блока, а не в разделе объявлений, как явные курсоры. В инструкции содержится предложение INTO или BULK COLLECT INTO, которое является частью языка PL/SQL, а не SQL, и представляет собой механизм пересылки данных из базы данных в структуры данных PL/SQL. Инструкцию SELECT не нужно открывать, выбирать из неё данные и закрывать. Все эти операции делаются автоматически.

Объявление неявного курсора SELECT список_столбцов [BULK COLLECT] INTO список_переменых_PL/SQL SELECT ……. DECLARE v_emp employee. Объявление неявного курсора SELECT список_столбцов [BULK COLLECT] INTO список_переменых_PL/SQL SELECT ……. DECLARE v_emp employee. name%TYPE BEGIN SELECT name INTO v_emp FROM emploee WHERE employee_id=345 END;

Атрибуты курсора Атрибут Что возвращает %FOUND Значение TRUE если успешно выбрана хотя бы одна Атрибуты курсора Атрибут Что возвращает %FOUND Значение TRUE если успешно выбрана хотя бы одна строка. %NOTFOUND Значение TRUE если инструкция не выбрала не одной строки %ROWCOUNT Количество строк выбранных из курсора на данный момент времени %ISOPEN Значение TRUE если курсор открыт %BULK_ROWCOUNT Коллекция, в которой для каждого элемента исходной коллекции, задано количество строк модифицированных SQL инструкцией при помощи оператора FORALL %BULK_EXCEPTION Коллекция, в которой для каждого элемента исходной коллекции при помощи оператора FORALL, инициировано ORACLE

Объявление явного курсора CURSOR имя_курсора [(параметр)] [RETURN спецификация_return] IS инструкция_SELECT FOR UPDATE [OF список_столбцов]]; Объявление явного курсора CURSOR имя_курсора [(параметр)] [RETURN спецификация_return] IS инструкция_SELECT FOR UPDATE [OF список_столбцов]]; DECLARE CURSOR cur_employee IS SELECT * FROM employee; v_employee_rec employee%ROWTYPE; BEGIN OPEN cur_employee; FETCH cur_employee INTO employee_rec; CLOSE cur_employee ; END;

Примеры явных курсоров Курсор без параметров CURSOR cur_company IS SELECT company_id FROM company; Курсор Примеры явных курсоров Курсор без параметров CURSOR cur_company IS SELECT company_id FROM company; Курсор с параметрами. CURSOR cur_company(company_id_in NUMBER) IS SELECT name FROM company WHERE compane_id=company_id_in Курсор с предложением RETURN. CURSOR cur_emp RETURN employee%ROWTYPE IS SELECT * FROM employee WHERE department_id=10

Пример использования явного курсора DECLARE r. Emp hr. Employees%ROWTYPE; CURSOR c. Cur 1 IS Пример использования явного курсора DECLARE r. Emp hr. Employees%ROWTYPE; CURSOR c. Cur 1 IS SELECT * FROM hr. employees; BEGIN Open c. Cur 1; LOOP FETCH c. Cur 1 into r. Emp; EXIT WHEN c. Cur 1%NOTFOUND; If MONTHS_BETWEEN(SYSDATE, r. Emp. Hire_date)/12 >= 10 then DBMS_Output. PUT_LINE('Номер сотрудника: ' || r. Employee_ID || ' Имя фамилия: ' || r. Emp. first_name || ' ' || r. Emp. last_name || ' Больше или равно 10 лет') ELSE DBMS_Output. PUT_LINE('Номер сотрудника: ' || r. Employee_ID || ' Имя и фамилия: ' || r. Emp. first_name || ' ' || r. Emp. last_name || ' Меньше 10 лет'); END IF; END LOOP; CLOSE c. Cur 1; END;

Пример использования явного курсора CREATE TABLE employee 2 AS SELECT * FROM employee WHERE Пример использования явного курсора CREATE TABLE employee 2 AS SELECT * FROM employee WHERE 1=2; DECLARE CURSOR cur_emp IS SELECT * FROM employee; TYPE fetch_array IS TABLE OFF cur_emp%ROWTYPE; emp_array fetch_array; BEGIN OPEN cur_emp; LOOP FETCH cur_emp BULK COLLECT INTO emp_array LIMIT 1000; FORALL i IN 1. . emp_array. COUNT INSERT INTO employeer 2 VALUES emp_array(i); EXIT WHEN emp_cur%NOTFOUND; END LOOP; CLOSE emp_cur; COMMIT;

Объявление курсорной переменной Имя_курсорной_переменной имя_типа_курсора DECLARE TYPE type_cur_sports_car IS REF CURSOR RETURN car%ROWTYPE cur_sport_car Объявление курсорной переменной Имя_курсорной_переменной имя_типа_курсора DECLARE TYPE type_cur_sports_car IS REF CURSOR RETURN car%ROWTYPE cur_sport_car type_cur_sports_car; BEGIN … END; Курсорная переменная 2 Общая память PL/SQL Курсорная переменная Объект курсора Результиру ющий набор строк

Открытие курсорной переменной Инициализацию курсорной переменной (создание объекта курсора и помещения ссылки на него Открытие курсорной переменной Инициализацию курсорной переменной (создание объекта курсора и помещения ссылки на него в переменную) выполняет оператор OPEN с предложением FOR, в котором задаётся SQL инструкция. OPEN имя_курсора FOR инструкция_select DECLARE TYPE curtype_emp IS REF CURSOR RETURN emp%ROWTYPE; v_enm_curval curtype_emp; BEGIN OPEN v_enm_curval FOR SELECT * FROM emp; END;

Ограничения связанные с курсорными переменными Курсорная переменная не может быть объявлена в пакете Если Ограничения связанные с курсорными переменными Курсорная переменная не может быть объявлена в пакете Если курсорная переменная передана как переменная привязки, на сервере нельзя выбирать из неё строки Курсорную переменную нельзя с помощью операторов сравнения проверять на равенство или не равенство, в том числе и на NULL Курсорной переменной нельзя присвоить значение NULL Значения курсорной переменной нельзя хранить в столбцах таблицы. Значение курсорной переменной не может содержаться во вложенной таблице, ассоциативном массиве или VARRAY Типы REF CURSOR не могут использоваться для определения элементов коллекции.

Рекомендуемая литература С. Фейерштейн, Б. Прибыл Oracle PL/SQL для профессионалов Рекомендуемая литература С. Фейерштейн, Б. Прибыл Oracle PL/SQL для профессионалов

Контакты: Хайновская Наталья natalix 83@mail. ru Контакты: Хайновская Наталья natalix [email protected] ru

СПАСИБО ЗА ВНИМАНИЕ! СПАСИБО ЗА ВНИМАНИЕ!