oracle 复合类型-record、数组、%type、%rowtype、plsql table类型
知识点:
1,ORACLE 在 PL/SQL 中除了提供象前面介绍的各种类型外,还提供一种称为复合类型的类型---
记录和表.
记录类型类似于C语言中的结构数据类型,它把逻辑相关的、分离的、基本数据类型的变量组成一个整体存储起来,它必须包括至少一个标量型或RECORD 数据类型的成员,称作PL/SQL RECORD 的域(FIELD),其作用是存放互不相同但逻辑相关的信息。在使用记录数据类型变量时,需要先在声明部分先定义记录的组成、记录的变量,然后在执行部分引用该记录变量本身或其中的成员。
定义记录类型语法如下:
TYPE record_name IS RECORD( v1 data_type1 [NOT NULL] [:= default_value ], v2 data_type2 [NOT NULL] [:= default_value ], ...... [color=red]//注意末尾不能带逗号[/color] vn data_typen [NOT NULL] [:= default_value ] );
declare type test_rec is record( name varchar2(30) not null := '胡勇', info varchar2(100) --该处末尾不能添加逗号 ); rec_book test_rec;begin rec_book.name := '陈超阳'; rec_book.info := '中华人民共和国'; dbms_output.put_line(rec_book.name || ',' || rec_book.info);end;
declare --定义与hr.employees表中的这几个列相同的记录数据类型 type record_type_emp is record( v_ename emp.ename%type, v_job emp.job%type, v_sal emp.sal%type ); --声明一个该记录数据类型的记录变量 v_emp_record record_type_emp;begin --注意查询的类型应该与复合变量成员的顺序一致 select ename,job,sal into v_emp_record from emp where empno = 7369; dbms_output.put_line(v_emp_record.v_ename); dbms_output.put_line(v_emp_record.v_job); dbms_output.put_line(v_emp_record.v_sal);end;
declare type type_mytype is record( ename scott.emp.ename%type, job scott.emp.job%type, sal scott.emp.sal%type ); v_mytype type_mytype;begin select e.ename,e.job,e.sal into v_mytype from scott.emp e where empno = '7499'; dbms_output.put_line(v_mytype.ename);end;
TYPE varray_name IS VARRAY(size) OF element_type [NOT NULL];
--定义数组类型declare --定义一个最多保存5个varchar(25)数据类型成员的varray数据类型 type reg_varray_type is varray(5) of varchar(25); --声明一个该varray数据类型的变量 v_reg_varray reg_varray_type;begin --用构造函数赋予初值(注意赋值方式--构造函数) [color=red] --访问数组是从下标1开始的(不是0)[/color] v_reg_varray := reg_varray_type('中国','美国','英国','日本','河南'); dbms_output.put_line(v_reg_varray(1)); dbms_output.put_line(v_reg_varray(2)); dbms_output.put_line(v_reg_varray(3)); dbms_output.put_line(v_reg_varray(4)); dbms_output.put_line(v_reg_varray(5));end;
DECLARE -- 用%TYPE 类型定义与表相配的字段 TYPE T_Record IS RECORD( T_no emp.empno%TYPE, T_name emp.ename%TYPE, T_sal emp.sal%TYPE ); -- 声明接收数据的变量 v_emp T_Record; BEGIN SELECT empno, ename, sal INTO v_emp FROM emp WHERE empno=7788; DBMS_OUTPUT.PUT_LINE(TO_CHAR(v_emp.t_no)||' '||v_emp.t_name||' ' || TO_CHAR(v_emp.t_sal));end;
declare v_empno emp.empno%type := &no; rec emp%rowtype;begin select * into rec from emp where empno = v_empno; dbms_output.put_line(rec.ename); dbms_output.put_line(rec.job); dbms_output.put_line(rec.sal); dbms_output.put_line(rec.deptno);end;