Записи и коллекции в PL/SQL
Записи и коллекции являются составными структурами данных. Записи очень похожи на строки в таблицах баз данных (БД). Коллекция – это структура данных, похожая на одномерный массив. В PL/SQL используются три типа коллекций: ассоциативные массивы, вложенные таблицы и массивы VARRAY.
1. Записи в PL/SQL
Организация данных в виде записей позволяет выполнять различные операции не только над их отдельными элементами, но и над записью как единым целым.
1.1. Объявление записей
§ на основе курсора
§ на основе таблицы базы данных
§ вручную, используя оператор TYPE . . . RECORD
1.1.1.Объявление записей на основе курсора
CURSOR c_stan IS
SELECT * FROM stations WHERE nod=2;
r_stan c_stan%ROWTYPE;
DECLARE
TYPE t_c_stan IS REF CURSOR RETURN stations%ROWTYPE;
c_stan t_c_stan;
r_stan c_stan%ROWTYPE;
BEGIN
FOR r_stan IN (SELECT * FROM stations WHERE nod=2) LOOP
DBMS_OUTPUT.LINE_PUT(‘Station is ’|| r_stan.name);
END LOOP;
END;
1.1.2. Объявление записей на основе таблицы
DECLARE
r_sal study.sal%ROWTYPE;
1.1.3. Записи, определяемые программистом
TYPE имя_типа IS RECORD (
имя_поля1 тип_данных1,
имя_поля2 тип_данных2,
. . .
имя_поляN тип_данныхN ) ;
§ Скалярный тип данных (VARCHAR2, NUMBER и т.д.)
§ Подтип, определяемый программистом
§ Тип, на основе уже определенной структуры данных (%TYPE, %ROWTYPE)
§ Тип коллекции PL/SQL
§ Тип REF CURSOR
имя_записи тип_записи;
TYPE r_sal_totl IS RECORD (
sal_att study.sal%ROWTYPE,
curr_date DATE := sysdate,
ords_cnt NUMBER(4),
ords_sum NUMBER(9,2) ) DEFAULT null ) ;
rSal r_sal_totl;
1.2. Обработка записей
Независимо от метода определения записи приемы работы с ней всегда одинаковы. Обрабатываться может либо вся запись целиком, либо каждое отдельное поле.
1.2.1. Операции над записями
§ копирование содержимого одной записи в другую (записи должны быть однотипными)
§ присваивание записи значения NULL
§ передача записи процедуре или функции в качестве аргумента
§ возврат записи из функции
rSal_tab study.sal%ROWTYPE;
CURSOR c_sal IS SELECT * FROM study.sal;
rSal_cur c_sal %ROWTYPE;
BEGIN
. . .
rSal_tab := rSal_cur;
END;
PROCEDURE output_ord(rOrd_in IN ord%ROWTYPE) IS
rOrd ord %ROWTYPE := rOrd_in;
BEGIN
DBMS_OUTPUT.PUT_LINE(‘Date order is ’|| rOrd.odate);
END;
§ Нельзя использовать синтаксис ISNULL для проверки, все ли поля записи имеют значение NULL. Это можно сделать лишь проверкой каждого поля
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.