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

⚡ Умное резюме

Тип записи PL/SQL — это сложный тип данных, который объединяет несколько столбцов, каждый со своим именем и типом данных, в один новый тип. Запись может быть определена на уровне базы данных как хранимый объект или внутри подпрограммы, а доступ к ее полям осуществляется с помощью точечного оператора.

  • 🧱 Определение: Тип записи объединяет один или несколько столбцов в один новый тип данных.
  • 🔑 Ключевое слово Ключевое слово 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 (НОМЕР)
  • 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 (номер сотрудника), YYY (имя сотрудника), 15000 (зарплата) и 1000 (номер менеджера).
  • Code строка 12: Завершение транзакции вставки.
  • Code строка 13: Заполнение переменной 'guru99_emp_rec' на уровне строки из запроса SELECT для сотрудника с номером 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 Предлагаются два типа привязанных записей, которые автоматически копируют свою структуру. Использование этих типов позволяет избежать повторного объявления столбцов и обеспечивает соответствие записи таблице или курсору, на котором она основана.

Тип записи Объявлено с Структура возникает из
Запись на основе таблицы table_name%ROWTYPE Все столбцы таблицы
Запись, основанная на курсоре cursor_name%ROWTYPE Список выбора курсора
Запись, определяемая программистом ТИП… ЭТО ЗАПИСЬ Столбцы, которые вы перечисляете вручную.

Запись с префиксом %ROWTYPE — наиболее безопасный выбор, если форма записи должна соответствовать таблице или... курсор, потому что изменение столбца автоматически обнаруживается при следующей компиляции.

Часто задаваемые вопросы (FAQ)

Запись объединяет различные столбцы, возможно, разных типов, в одну построчную структуру. Коллекция содержит множество элементов одного типа, индексируемых нижним индексом. Часто они объединяются, образуя коллекцию записей.

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

Да, если обе записи одного типа. Оператор SELECT INTO также может заполнить всю запись из строки таблицы, при условии, что порядок элементов в списке выбора соответствует порядку полей в записи.

Да. Искусственный интеллект может прочитать определение таблицы и создать соответствующий блок TYPE … IS RECORD или рекомендовать %ROWTYPE, если предпочтительнее использовать прямую ссылку на таблицу. Перед использованием проверьте типы данных.

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

Подведем итог этой публикации следующим образом: