Первичный ключ (BINARY_INTEGER) |
Столбец данных (скалярный тип) |
||
1 |
ADAMS |
||
2 |
FORD |
||
3 |
CLARK |
||
… |
… |
Рисунок 2 Таблица PL/SQL
· RECORD (запись)
o Запись должна содержать одну или несколько компонент (полей) скалярного типа, типа RECORD или типа TABLE (Рисунок 3)
o Совокупность полей рассматривается как логическая единица
o Записи удобны для выборки строк данных из таблицы базы данных для обработки
Поле 1 |
Поле 2 |
Поле 3 |
… |
Рисунок 3 Запись PL/SQL
Объявление таблицы PL/SQL происходит в два этапа: сначала объявляется тип данных TABLE, потом объявляется переменная этого типа.
TYPE имя_типаIS TABLE OF скалярный_тип[NOT NULL] INDEX BY BINARY_INTEGER;
идентификатор имя_типа;
имя_типа – имя типа TABLE
скалярный_тип – тип данных для элементов таблицы PL/SQL. Можно использовать атрибут %TYPE
NOT NULL – не позволяет присваивать неопределенные значения таблице PL/SQL этого типа
идентификатор – имя идентификатора
SQL> DECLARE
2 TYPE tp IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
3 var1 tp;
4 BEGIN
5 NULL;
6 END;
7 /
PL/SQL procedure successfully completed.
Объявление записи PL/SQL, также, происходит в два этапа: сначала объявляется тип данных RECORD, потом объявляется переменная этого типа.
TYPE имя_типа ISRECORD (имя_поля
тип_поля [NOTNULL] [{ := | DEFAULT } выражение],
имя_поля тип_поля [NOTNULL] [{ := | DEFAULT } выражение], ...);
идентификатор имя_типа;
имя_типа – имя типа RECORD
имя_поля – имя поля записи PL/SQL
тип_поля – тип данных поля. Можно использовать атрибуты %TYPE и %ROWTYPE
NOT NULL – не позволяет присваивать неопределенные значения полям записи этого типа
выражение – любое выражение PL/SQL, используемое для инициализации поля
идентификатор – имя идентификатора
Для объявления записи на основе набора столбцов из таблицы или представления базы данных используется атрибут %ROWTYPE. При таком объявлении поля записи PL/SQL наследуют имена и типы данных соответствующих столбцов таблицы или представления.
имя_таблицы%ROWTYPE
SQL> DECLARE
2 TYPE tp IS RECORD
3 (f1 BINARY_INTEGER,
4 f2 BOOLEAN := FALSE,
5 f3 CHAR(10));
6 var1 tp;
7 var2 dept%ROWTYPE;
8 BEGIN
9 NULL;
10 END;
11 /
PL/SQL procedure successfully completed.
Область видимости – это та часть программы, в которой можно ссылаться на данный объект. Ссылаться на идентификатор можно в выполняемой секции того блока, в котором он объявлен, а также в выполняемых секциях всех вложенных в него блоков, процедурах и функциях. Если блок не находит локально описанного идентификатора, он просматривает декларативные секции внешних блоков. Во вложенных блоках и в блоках того же уровня идентификатор никогда не ищется.
Пример анонимного блока, в который вложен подблок. В декларативных секциях обоих блоков объявлена переменная var1. Для вывода переменной внутри блока PL/SQL используется процедура put_line встроенного пакета DBMS_OUTPUT.
SQL> DECLARE
2 var1 NUMBER;
3 BEGIN
4 var1 := 123;
5 DECLARE
6 var1 NUMBER;
7 BEGIN
8 var1 := 456;
9 END;
10 DBMS_OUTPUT.put_line(var1);
11 END;
12 /
123
PL/SQL procedure successfully completed.
Для присвоения значения переменной используется оператор присваивания PL/SQL (:=)
Для скалярного идентификатора:
идентификатор := выражение;
Для таблицы PL/SQL
имя_таблицы(значение_первичного_ключа) := выражение;
Для записи PL/SQL
имя_записи.имя_поля := выражение;
SQL> DECLARE
2 var1 NUMBER;
3 TYPE tt IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
4 var2 tt;
5 TYPE tr IS RECORD
6 (f1 BINARY_INTEGER,
7 f2 BOOLEAN := FALSE,
8 f3 CHAR(10));
9 var3 tr;
10 BEGIN
11 var1 := 123;
12 var2(1) := 456;
13 var2(1000) := 789;
14 var3.f2 := TRUE;
15 END;
16 /
PL/SQL procedure successfully completed.
В выражениях PL/SQL можно использовать операторы, такие же, как в SQL:
· Арифметические
· Логические
· Оператор конкатенации
Кроме этого используется оператор возведения в степень (**).
Порядком выполнения операторов, как и в SQL, можно управлять с помощью скобок.
В выражениях PL/SQL допустимо использование однострочных функций:
· Числовых функций
· Символьных функций
· Функций преобразования типов данных
o TO_CHAR
o TO_DATE
o TO_NUMBER
· Функций для работы с датами
Использование групповых функций допускается только в командах SQL.
Если типы данных в выражении не совпадают, PL/SQL пытается преобразовать типы данных сам, но это не всегда возможно и сложно предсказать результат таких преобразований. Лучше, когда разработчик приложения явно преобразовывает типы данных с помощью функций преобразования.
В блоках PL/SQL допустимы ссылки на переменные, которые не являются переменными PL/SQL, а объявлены в вызывающей среде (хост-среде). Это разрешается в тех случаях, если ссылка на внешнюю переменную (хост-переменную) не находится внутри процедуры, функции или пакета.
Ссылке на хост-переменную должно предшествовать двоеточие.
SQL*Plus содержит команды для объявления и вывода хост-переменных
§ В SQL*Plus для объявления хост-переменной используется команда VARIABLE
VARIABLE переменная[NUMBER | CHAR | CHAR(n) | VARCHAR2(n)]
§ Для вывода текущего значения хост-переменных используется команда PRINT
PRINT переменная
§ Одну команду PL/SQL можно выполнить с помощью команды EXECUTE. В этом случае ключевые слова BEGIN и END необязательны
EXECUTE команда_plsql
SQL> VARIABLE v_host NUMBER
SQL> EXECUTE :v_host := 123
PL/SQL procedure successfully completed.
SQL> PRINT v_host
V_HOST
---------
123
Необходимо понимать разницу между переменными подстановки и хост-переменными:
Переменные подстановки |
Хост-переменные |
Объявляются с помощью команд DEFINE, ACCEPT |
Объявляются с помощью команды VARIABLE |
Ссылке на переменную должен предшествовать амперсант (&) |
Ссылке на переменную должно предшествовать двоеточие (:) |
Значение переменной нельзя изменить или присвоить в блоке PL/SQL |
Значение переменной можно изменить или присвоить в блоке PL/SQL |
SQL> DEFINE v_subst = 100
SQL> VARIABLE v_host NUMBER
SQL> DECLARE
2 v_local NUMBER;
3 BEGIN
4 v_local := 1000 + &v_subst;
5 :v_host := v_local;
6 END;
7 /
old 4: v_local := 1000 + &v_subst;
new 4: v_local := 1000 + 100;
PL/SQL procedure successfully completed.
SQL> PRINT v_host
V_HOST
---------
1100
1. Вильям Дж. Пэйдж Использование Oracle8/8i: пер. с англ. – М.: Издательский дом "Вильямс", 1999.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.