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>’
数据库级别声明的语法
CREATE TYPE <type_name_db> IS RECORD ( <column 1> <datatype>, );
在第一个语法中,我们看到关键字‘CREATE TYPE’,它指示编译器创建一个名为“type_name_db”的 record 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’,并使用它来填充和显示其数据。
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’,并使用它来填充和显示其数据。
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 的值重定向到任何输出模式时,它只能以列级别访问。