Oracle Типове PL/SQL записи с примери

⚡ Умно обобщение

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

  • 🧱 Определение: Типът запис групира една или повече колони в един нов тип данни.
  • 🔑 Ключова дума: Ключовата дума TYPE указва на компилатора, че се създава нов тип данни.
  • 🏛️ Две нива: Запис на ниво база данни е съхранен обект; запис на ниво подпрограма е видим само в рамките на тази подпрограма.
  • 🔗 Достъп до полето: Полетата се достигат като record_variable.column_name, използвайки оператора точка.
  • 📥 На ниво колона: Стойностите могат да се присвояват на едно поле едновременно.
  • 📦 Ниво на ред: SELECT INTO може да попълни цял запис от ред в таблица.
  • 🧩 Видове записи: Таблицен %ROWTYPE, базиран на курсор %ROWTYPE и записи, дефинирани от програмист.

Oracle Тип PL/SQL записи

Какво е тип запис?

Типът запис е сложен тип данни, който позволява на програмиста да създаде нов тип данни с желаната структура на колоните. Основните му характеристики са:

  • Той групира една или повече колони, за да образува нов тип данни.
  • Всяка от тези колони има свое собствено име и тип данни.
  • Типът запис може да приема данните като единичен запис, състоящ се от много колони, или може да приема стойността за една конкретна колона от запис.
  • Типът запис е просто нов тип данни. След като бъде създаден, той се съхранява като нов тип данни и може да се използва за деклариране на променлива в програми.
  • Използва ключовата дума „ТИП“ да инструктира компилатора, че се създава нов тип данни.
  • Може да бъде създаден в ниво на базата данни, съхраняван като обект на базата данни и използван в цялата база данни или в ниво на подпрограма, видим само вътре в подпрограмата.
  • За колони на таблица може да се декларира и тип запис на ниво база данни, така че една колона да може да съдържа сложни данни.
  • Достъпът до данните се осъществява чрез позоваване на името на променливата, след това на оператор за точка (.), накрая на името на колоната, като ' . '.

Синтаксис за деклариране на тип запис

Синтаксис за деклариране на ниво база данни:

Декларация на типа запис на ниво база данни

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 е най-безопасният избор, когато формата трябва да следва таблица или курсор, защото промяната в колоната се улавя автоматично при следващата компилация.

Въпроси и Отговори

Записът групира различни колони от евентуално различни типове в една структура, подобна на ред. Колекцията съдържа много елементи от един и същи тип, индексирани с индекс. Те често са комбинирани, образувайки колекция от записи.

%ROWTYPE декларира запис, чиито полета автоматично съвпадат с таблица или курсор. Използвайте го, когато записът трябва да отразява този източник, така че промяната в колоната да се отрази без редактиране на декларацията.

Да, ако и двата записа са от един и същи тип. SELECT INTO може също да запълни цял запис от ред в таблица, при условие че редът на полетата в списъка за избор съвпада с реда на полетата в записа.

Да. Изкуственият интелект може да прочете дефиницията на таблица и да генерира съответстващ блок TYPE ... IS RECORD или да препоръча %ROWTYPE, където е за предпочитане активна връзка към таблицата. Проверете типовете данни преди употреба.

Запис на ниво база данни се създава с CREATE TYPE и се съхранява като обект, видим в базата данни. Запис на ниво подпрограма се декларира вътре в блок и съществува само в рамките на тази подпрограма.

Обобщете тази публикация с: