Информационное обеспечение



бет22/56
Дата05.03.2023
өлшемі256,49 Kb.
#71567
түріПрактикум
1   ...   18   19   20   21   22   23   24   25   ...   56

Контрольные вопросы





  1. Чем отличаются триггеры от хранимых процедур и функций?

  2. Какие типы триггеров существуют?

  3. В чем различия строкового и операторного триггеров?

  4. Какие псевдозаписи и для чего используются в триггерах?

  5. Какие триггеры называют системными?

  6. На какие события срабатывают DDL-триггеры?

  7. Что такое COMPOUND-триггер и в чем особенность его работы?

  8. Для чего используются триггеры INSTEAD OF?

  9. От чего зависит последовательность выполнения триггеров?

  10. Какие атрибуты есть у триггеров и для чего они применяются?

  11. Как можно приостановить работу триггера?

  12. Где и как можно посмотреть информацию о триггерах для определен- ной таблицы?

  13. Какие возможности предоставляет пакет DBMS_SCHEDULER?

  14. Какими значениями можно определить частоту и интервал запуска планировщика?

  15. Что такое расписание и как оно создается?

ЛАБОРАТОРНАЯ РАБОТА №6




ДИНАМИЧЕСКИЙ SQL


Цель работы – изучить возможности пакета DBMS_SQL и встроенного динамического SQL для написания процедур динамической обработки SQL- операторов и блоков PL/SQL, а также научиться применять и управлять такими программными конструкциями, как коллекции.


Теоретические сведения




Коллекции в PL/SQL. Коллекцией в PL/SQL называется упорядоченная группа элементов любого типа, фактически коллекция представляет собой од- номерный массив, элементы которого могут иметь как простой, стандартный тип (VARCHAR, NUMBER и т. д.), так и составные типы RECORD, OBJECT.
СУБД Oracle поддерживает три типа коллекций, каждый из которых име- ет свои особенности.

    1. Ассоциативный массив (таблицы PL/SQL или INDEX BY) – это не- ограниченные разреженные массивы, состоящие из однородных элементов и индексируемые по номеру элемента. Начиная с версий 9i, допускается индек- сирование ассоциативных массивов посредством значений с типами VARCHAR2 или PLS_INTEGER. Данный вид коллекций нельзя использовать в качестве типа данных столбца таблицы.

    2. Вложенные таблицы – NESTED TABLES – одномерные массивы, со- стоящие из однородных элементов. Вложенные таблицы можно использовать как в программах PL/SQL, так и в базе данных.

    3. Массивы VARRAY – одномерные массивы, состоящие из однородных элементов, размер которых ограничен, и они не могут быть разреженными. Массивы VARRAY можно использовать в качестве типа данных для столбцов таблиц.

Объявление коллекций. Объявление типов коллекций выполняется анало- гично объявлению типа данных оператором TYPE.

Объявление ассоциативного массива:


TYPE имя_типа_таблицы IS TABLE OF тип_данных [NOT NULL]


INDEXBY [BINARY_INTEGER |
подтип_типа BINARY_INTEGER | VARCHAR2 (максимальный_индекс)]; Объявление вложенной таблицы:
/* так объявляются типы для использования в базе данных */
CREATE [OR REPLACE] TYPE имя_типа AS | IS
TABLE OF тип_данных_элемента [NOTNULL];

Для использования в программах PL/SQL можно не регистрировать в базе данных тип, а объявлять его непосредственно в программах PL/SQL. В этом случае слово CREATE опускается.


Объявление массива VARRAY:
CREATE [OR REPLACE] TYPE имя_типа IS
VARRAY (максимальный_индекс) OF тип_данных_элемента [NOT NULL];
Объявление переменных с типом коллекция выполняется аналогично объявлению любой другой переменной:
имя_переменной тип_переменной [NOT NULL] [DEFAULT | := значе- ние_по_умолчанию];
Операции с коллекциями. Для оперирования коллекциями имеются встро- енные функции, которые называются методами коллекций (табл. 4).
Таблица 4
Методы коллекций



Метод

Описание

Ассоци- ативный массив

Вложен- ная таб- лица

Массив перемен- ной
длины

COUNT

Функция, возвращающая количе-
ство элементов в коллекции

+

+

+

DELETE

Процедура, удаляющая элементы коллекции:
DELETE(i) – один элемент; DELETE(i,j) – c i-го по j-й элементы; DELETE – все элементы коллекции

+

+

+

EXISTS

Проверяет наличие заданного эле-
мента в коллекции

+

+

+

EXTEND

Добавляет элементы в коллекцию



+

+

FIRST,
LAST

Возвращают наименьший и
наибольший индексы коллекций

+

+

+

LIMIT

Возвращает максимальное количество
элементов





+

PRIOR,
NEXT

Возвращают индекс предыдущего и
следующего элемента коллекции

+

+

+

TRIM

Удаляет n последних элементов
коллекции



+

+

Для начала работы необходимо коллекцию инициализировать. Это можно сделать: 1) явным образом, используя конструктор; 2) путем выборки элемен- тов из базы данных в коллекцию; 3) присваивая ей содержимое другой пере- менной-коллекции.
Для примера определим следующие типы данных:
/*тип для хранения информации о присутствии сотрудника на работе */ CREATE OR REPLACE TYPE maska_type IS VARRAY (31) OF NUMBER;
Инициализировать коллекцию с типом maska_type можно следующим об- разом:

DECLARE
-- инициализация maska1 с помощью конструктора maska1 maska_type := maska_type(1,1,0,0,1,1,1,1,1,1,0,1,1);


maska2 maska_type; -- пока коллекция не инициализирована maska3 maska_type; -- пока коллекция не инициализирована BEGIN
-- инициализация maska2 присвоением maska2:=maska1; -- инициализация maska1
-- инициализация maska3 путем выборки элементов из базы данных SELECT CAST (MULTISET (SELECT rownum FROM all_tables WHERE
rownum <=31) as maska_type) INTO maska3 FROM DUAL; END;
/

Присваивание значений элементам коллекции производится стандартным оператором присваивания. Ассоциативные массивы позволяют присваивать значения произвольным элементам коллекций. В отличие от них массивы VARRAY и вложенные таблицы индексируются автоматически PL/SQL. При этом прежде чем присвоить значение строке вложенной таблицы или VARRAY, необходимо расширить коллекцию при помощи оператора EXTEND.


/*объект для хранения данных о персоне*/


CREATE OR REPLACE TYPE inf_type AS OBJECT (


first_name VARCHAR2 (20), dater DATE);
/
/*вложенная таблица для хранения информации о детях сотрудников */ CREATE OR REPLACE TYPE lst_inf_type AS TABLE OF inf_type;
/
DECLARE
lst_child lst_inf_type := lst_inf_type(); BEGIN
DBMS_OUTPUT.PUT_LINE('count in lst_child ='||lst_child.count); lst_child.EXTEND;
lst_child (lst_child.LAST):=
inf_type ('Николай',TO_DATE('05.06.1996', 'dd.mm.yyyy')); lst_child.EXTEND;
lst_child (lst_child.last):=
inf_type ('Ольга',TO_DATE('28.11.2000', 'dd.mm.yyyy')); DBMS_OUTPUT.PUT_LINE ('count in lst_child ='||lst_child.count); FOR i IN lst_child.FIRST..lst_child.LAST
LOOP
DBMS_OUTPUT.PUT_LINE (i||': '|| lst_child(i).FIRST_NAME||': '|| lst_child(i).DATER);
END LOOP;
END;
/




Достарыңызбен бөлісу:
1   ...   18   19   20   21   22   23   24   25   ...   56




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет