Oracle Типове PL/SQL записи с примери
⚡ Умно обобщение
PL/SQL Record Type е сложен тип данни, който групира няколко колони, всяка със собствено име и тип данни, в един нов тип. Записът може да бъде дефиниран на ниво база данни като съхранен обект или в подпрограма, а полетата му се достигат с оператора точка.

Какво е тип запис?
Типът запис е сложен тип данни, който позволява на програмиста да създаде нов тип данни с желаната структура на колоните. Основните му характеристики са:
- Той групира една или повече колони, за да образува нов тип данни.
- Всяка от тези колони има свое собствено име и тип данни.
- Типът запис може да приема данните като единичен запис, състоящ се от много колони, или може да приема стойността за една конкретна колона от запис.
- Типът запис е просто нов тип данни. След като бъде създаден, той се съхранява като нов тип данни и може да се използва за деклариране на променлива в програми.
- Използва ключовата дума „ТИП“ да инструктира компилатора, че се създава нов тип данни.
- Може да бъде създаден в ниво на базата данни, съхраняван като обект на базата данни и използван в цялата база данни или в ниво на подпрограма, видим само вътре в подпрограмата.
- За колони на таблица може да се декларира и тип запис на ниво база данни, така че една колона да може да съдържа сложни данни.
- Достъпът до данните се осъществява чрез позоваване на името на променливата, след това на оператор за точка (.), накрая на името на колоната, като ' . '.
Синтаксис за деклариране на тип запис
Синтаксис за деклариране на ниво база данни:
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
В първия синтаксис, ключовата дума „CREATE TYPE“ инструктира компилатора да създаде типа запис с име „type_name_db“ с посочените колони като обект на базата данни. Това се дава като отделен оператор, а не вътре в който и да е блок.
Синтаксис за декларация на ниво подпрограма:
DECLARE TYPE <type_name> IS RECORD ( <column1> <datatype>, ); BEGIN <execution_section>; END;
В този синтаксис създаваме типа запис с име „type_name“ само в подпрограмата. И в двата метода начинът за дефиниране на колоната и типа данни е подобен.
Пример 1: Тип запис като обект на база данни
В тази програма виждаме как да създадем тип запис като обект на база данни. Създаваме тип запис 'emp_det' с четири колони. Колоните и техните типове данни са:
- EMP_NO (NUMBER)
- EMP_NAME (VARCHAR2 (150))
- МЕНИДЖЪР (БРОЙ)
- ЗАПЛАТА (ЧИСЛО)
CREATE TYPE emp_det IS OBJECT ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); /
Изход:
Type created
Code Обяснение
- Горният код създава типа emp_det като обект на базата данни.
- Има 4 колони: emp_no, emp_name, manager и salary, както е дефинирано.
- Сега „emp_det“ е подобен на всеки друг тип данни (като NUMBER или VARCHAR2) и е видима в цялата база данни. Следователно може да се използва навсякъде в базата данни за деклариране на променлива от този тип.
Пример 2: Достъп на ниво подпрограма, ниво колона
В този пример виждаме как да създадем тип запис на ниво подпрограма и как да го попълваме и извличаме стойности по колони. Създаваме типа запис 'emp_det' на ниво подпрограма и го използваме за попълване и показване на данни.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN guru99_emp_rec.emp_no:= 1001; guru99_emp_rec.emp_name:= 'XXX'; guru99_emp_rec.manager:= 1000; guru99_emp_rec.salary:= 10000; dbms_output.put_line('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: ' ||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Изход:
Employee Detail Employee Number: 1001 Employee Name: XXX Employee Salary: 10000 Employee Manager Number: 1000
Code Обяснение
- Code ред 2-8: Запис от тип „emp_det“ е деклариран с колони emp_no, emp_name, manager и salary от тип данни NUMBER, VARCHAR2, NUMBER и NUMBER.
- Code ред 9: Променливата guru99_emp_rec е декларирана като тип данни 'emp_det'. Това променлив може да съдържа стойност, която съдържа и четирите полета.
- Code ред 11: Попълване на полето „emp_no“ на „guru99_emp_rec“ със стойност 1001.
- Code ред 12: Попълване на полето „emp_name“ със стойност XXX.
- Code ред 13: Попълване на полето „мениджър“ със стойност 1000.
- Code ред 14: Попълване на полето „заплата“ със стойност 10000.
- Code ред 15-19: Показване на стойността на 'guru99_emp_rec' в изхода.
Пример 3: Достъп на ниво подпрограма, ниво ред
В този пример виждаме как да създадем тип запис на ниво подпрограма и да го попълним на ниво ред. Създаваме типа запис 'emp_det' на ниво подпрограма и го използваме за попълване и показване на данни.
DECLARE TYPE emp_det IS RECORD ( EMP_NO NUMBER, EMP_NAME VARCHAR2(150), MANAGER NUMBER, SALARY NUMBER ); guru99_emp_rec emp_det; BEGIN INSERT INTO emp (emp_no, emp_name, salary, manager) VALUES (1002,'YYY',15000,1000); COMMIT; SELECT emp_no, emp_name, salary, manager INTO guru99_emp_rec FROM emp WHERE emp_no=1002; dbms_output.put_line ('Employee Detail'); dbms_output.put_line ('Employee Number: '||guru99_emp_rec.emp_no); dbms_output.put_line ('Employee Name: '||guru99_emp_rec.emp_name); dbms_output.put_line ('Employee Salary: '||guru99_emp_rec.salary); dbms_output.put_line ('Employee Manager Number: '||guru99_emp_rec.manager); END; /
Code Обяснение
- Code ред 2-8: Запис от тип „emp_det“ е деклариран с колони emp_no, emp_name, manager и salary от тип данни NUMBER, VARCHAR2, NUMBER и NUMBER.
- Code ред 9: Променливата guru99_emp_rec е декларирана като тип данни 'emp_det' и може да съдържа и четирите полета.
- Code ред 11: Попълване на таблицата emp с 1002 като emp_no, YYY като emp_name, 15000 като заплата и 1000 като номер на мениджър.
- Code ред 12: Извършване на вмъкната транзакция.
- Code ред 13: Попълване на променливата „guru99_emp_rec“ на ниво ред от заявката за избор за служител номер 1002.
- Code ред 15-19: Показване на стойността на 'guru99_emp_rec' в изхода.
Изход:
Employee Detail Employee Number: 1002 Employee Name: YYY Employee Salary: 1000 Employee Manager Number: 15000
Забележка: Достъп до тип запис може да се осъществи само на ниво колона при пренасочване на стойността му към произволен изходен режим. Обърнете внимание, че в този пример редът на SELECT списъка не съвпада с реда на полетата на записа, поради което стойностите на заплатата и мениджъра се показват разменени в изхода.
Видове PL/SQL записи
Отвъд показания по-горе запис, дефиниран от програмиста, Oracle предлага два вида закотвени записи, които автоматично копират структурата си. Използването им избягва повторното деклариране на колони и поддържа записа в съответствие с таблицата или курсора, на които е базиран.
| Вид запис | Декларирано с | Структурата идва от |
|---|---|---|
| Запис, базиран на таблица | име_на_таблица%ROWTYPE | Всички колони на таблица |
| Запис, базиран на курсор | име_на_курсора%ТИП_РЕД | Списъкът за избор на курсора |
| Запис, дефиниран от програмист | ТИП … Е ЗАПИС | Колони, които изброявате на ръка |
Записът от тип %ROWTYPE е най-безопасният избор, когато формата трябва да следва таблица или курсор, защото промяната в колоната се улавя автоматично при следващата компилация.




