%TYPE、%ROWTYPE、记录类型、表类型

1.%TYPE类型用于隐式地将变量的数据类型指定为对应列的数据类型。语法:
variable_name table_name.column_name%TYPE [ [NOT NULL]{ := | DEFAULT} value];

2.%TYPE类型只针对表中的某一列,而%ROWTYPE类型则针对表中的一行,使用%ROWTYPE类型定义的变量可以存储表中的一行数据。语法:
variable_name table_name%ROWTYPE;

**例子:
SET SERVEROUTPUT ON;
DECLARE
    emp_number CONSTANT emp.empno%TYPE := 7900;
    one_emp emp%ROWTYPE;
BEGIN
    SELECT * INTO one_emp FROM emp WHERE empno = emp_number;
    DBMS_OUTPUT.PUT_LINE('查询的员工的编号为:' || emp_number);
    DBMS_OUTPUT.PUT_LINE('该员工的姓名为:' || one_emp.ename);
    DBMS_OUTPUT.PUT_LINE('该员工的职位为:' || one_emp.job);
END;

3.记录类型与数据库中的表的行结果非常相似,使用记录类型定义的变量可以存储由一个或多个字段组成的一行数据。语法(创建记录类型需要使用TYPE关键字):
TYPE record_name IS RECORD (
              field_name data_type [ [NOT NULL] { := | DEFAULT} value]
              [,...]);

4.使用记录类型变量只能保存一行数据,这限制了select语句的返回行数,如果select语句返回多行就会报错。Oracle提供了另外一种自定义类型,也就是表类型,它是对记录类型的扩展,允许处理多行数据,类似表。语法:
TYPE table_name IS TABLE OF data_type [NOT NULL] INDEX BY BRINARY_INTEGER;
语法说明:
  • table_name:创建的表类型名称。
  • IS TABLE:表示创建的是表类型。
  • data_type:可以是任何合法的PL/SQL数据类型。
  • INDEX BY BRINARY_INTEGER:指定系统创建一个主键索引,用于引用表类型变量中的特定行。

**例子:
DECLARE
    TYPE my_emp IS TABLE OF emp%ROWTYPE INDEX BY BRINARY_INTEGER;
    new_emp my_emp;
BEGIN
    new_emp(1).empno := 6800;
    new_emp(1).ename := 'TRACY';
    new_emp(1).job   := 'CLERK';
    new_emp(1).sal   := 2500;
    new_emp(2).empno := 6900;
    new_emp(2).ename := 'LUCY';
    new_emp(2).job   := 'MANAGER';
    new_emp(2).sal   := 4000;
    
    DBMS_OUTPUT.PUT_LINES(new_emp(1).empno ||','|| new_emp(1).ename);
    DBMS_OUTPUT.PUT_LINES(new_emp(2).empno ||','|| new_emp(2).ename);
END;

你可能感兴趣的:(type)