Oracle PL/SQL 记录类型及示例

什么是 Record Type?

Record type 是一种复杂的数据类型,它允许程序员创建一种新的数据类型,具有所需的列结构。

  • 它将一个或多个列分组形成新的数据类型
  • 这些列将具有自己的名称和数据类型
  • Record type 可以接受数据
    • 作为包含许多列的单个记录,或者
    • 它可以接受记录中某个特定列的值
  • Record type 简单来说就是一种新的数据类型。一旦创建了 record type,它将被存储为数据库中的一种新数据类型,并在程序中用于声明变量。
  • 它将使用关键字 ‘TYPE’ 来指示编译器正在创建新的数据类型。
  • 它可以在“数据库级别”创建,作为数据库对象存储,并在整个数据库中使用;或者可以在“子程序级别”创建,仅在子程序中可见。
  • 数据库级别的 record type 也可以为表列声明,以便单个列可以存储复杂数据。
  • 可以通过引用其 variable_name 后跟句点运算符 (.) 再跟 column_name 来访问这些数据类型中的数据,即‘<record_type_variable_name>.<column_name>’

数据库级别声明的语法

Oracle PL/SQL Records Type

CREATE TYPE <type_name_db> IS RECORD
(
<column 1> <datatype>,
);

在第一个语法中,我们看到关键字‘CREATE TYPE’,它指示编译器创建一个名为“type_name_db”的 record type,并将指定的列作为数据库对象。

这是一个单独的语句,不在任何块中。

子程序级别声明的语法

Oracle PL/SQL Records Type

DECLARE
TYPE <type_name> IS RECORD
(
<columnl> <datatype>,
);
BEGIN
<execution_section>;
END;

在语法中,我们仅在子程序内部创建名为“type_name”的 record type。

在这两种声明方法中,定义列和数据类型的方式是相似的。

示例 1:Record Type 作为数据库对象

在此程序中,我们将学习如何创建“Record type”作为数据库对象。我们将创建 record type ‘emp_det’,它包含四个列。列及其数据类型如下:

  • EMP_NO (NUMBER)
  • EMP_NAME (VARCHAR2 (150))
  • MANAGER (NUMBER)
  • SALARY (NUMBER)
CREATE TYPE emp_det IS OBJECT
(
EMP_NO NUMBER,
EMP_NAME VARCHAR2(150),
MANAGER NUMBER,
SALARY NUMBER 
);
/

输出

Type created

代码解释

  • 上面的代码将创建类型 emp_det 作为数据库对象。
  • 它将包含如定义的 4 列:emp_no、emp_name、manager 和 salary。
  • 现在 ‘emp_det’ 与其他 数据类型(如 NUMBER、VARCHAR@ 等)类似。并且在整个数据库中可见。因此,它可以在整个数据库中用于声明此类型的变量。

输出

在数据库级别将类型 ‘emp_det’ 创建为 record type。

示例 2:子程序级别的 Record Type - 列级别访问

在此示例中,我们将学习如何在子程序级别创建 record type,以及如何通过列级别填充和获取其值。

我们将子程序级别的 record_type 创建为 ‘emp_det’,并使用它来填充和显示其数据。

Oracle PL/SQL Records Type

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

代码解释

  • 代码行 2-8:Record type ‘emp_det’ 以 NUMBER、VARCHAR2、NUMBER、NUMBER 的数据类型声明了 emp_no、emp_name、salary 和 manager 列。
  • 代码行 9: guru99_emp_rec 变量被声明为 ‘emp_det’ 数据类型。现在此 变量 可以容纳包含以上所有 4 个字段/列的值。
  • 代码行 11:将 ‘guru99_emp_rec’ 的 ‘emp_no’ 字段填充为值 1001。
  • 代码行 12:将 ‘guru99_emp_rec’ 的 ‘emp_name’ 字段填充为值 XXX。
  • 代码行 13:将 ‘guru99_emp_rec’ 的 ‘manager’ 字段填充为值 1000。
  • 代码行 14:将 ‘guru99_emp_rec’ 的 ‘salary’ 字段填充为值 10000。
  • 代码行 15-19:在输出中显示 ‘guru99_emp_rec’ 的值。

示例 3:子程序级别的 Record Type - 行级别访问

在此示例中,我们将学习如何在子程序级别创建 record type,以及如何以行级别填充它。我们将子程序级别的 record_type 创建为 ‘emp_det’,并使用它来填充和显示其数据。

Oracle PL/SQL Records Type

DECLARE
TYPE emp_det IS RECORD
(
EMP_NO NUMBER,
EMP_NAME YARCHAR2( 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;
/

代码解释

  • 代码行 2-8:Record type ‘emp_det’ 以 NUMBER、VARCHAR2、NUMBER、NUMBER 的数据类型声明了 emp_no、emp_name、salary 和 manager 列。
  • 代码行 9: guru99_emp_rec 变量被声明为 ‘emp_det’ 数据类型。现在此变量可以容纳包含以上所有 4 个字段/列的值。
  • 代码行 11:使用 emp_no 为 1002、emp_name 为 YYY、salary 为 15000 和 manager number 为 1000 的数据填充 emp 表。
  • 代码行 12:提交上述插入事务。
  • 代码行 13:通过针对员工编号 1002 的 select 查询,以行级别将 ‘guru99_emp_rec’ 变量填充为数据。
  • 代码行 15-19:在输出中显示 ‘guru99_emp_rec’ 的值。

输出

Employee Detail 
Employee Number: 1002 
Employee Name: YYY 
Employee Salary: 1000 
Employee Manager Number: 15000

注意:当将 record type 的值重定向到任何输出模式时,它只能以列级别访问。