1、PLSQL中的复杂自定义数据类型
PLSQL中常用的自定义类型就两种:记录类型、PLSQL内存表类型(根据表中的数据字段的简单和复杂 程度又可分别实现类似于简单数组和记录数组的功能)
A.类型定义的语法
TYPE type_name IS RECORD(field_declaration[, field_declaration]…);identifier type_name;#这里的field_declaration 的具体格式可以是field_name {field_type | variable%TYPE| table.column%TYPE | table%ROWTYPE}[[NOT NULL] {:= | DEFAULT} expr]
...TYPE emp_record_type IS RECORD(last_name VARCHAR2(25),job_id VARCHAR2(10),salary NUMBER(8,2));emp_record emp_record_type;...
B.%ROWTYPE属性
%ROWTYPE属性:在PLSQL中 %ROWTYPE 表示某张表的记录类型 或者是用户指定以的记录类型,使用此 属性可以很方便的定义一个变量,其类型与某张表的记录或者自定义的记录类型保持一致。极大的方便了 select * into ….的语句使用
DECLAREemp_rec employees%ROWTYPE;BEGINSELECT * INTO emp_recFROM employeesWHERE employee_id = &employee_number;INSERT INTO retired_emps(empno, ename, job, mgr, hiredate,leavedate, sal, comm, deptno)VALUES (emp_rec.employee_id, emp_rec.last_name, emp_rec.job_id,emp_rec.manager_id, emp_rec.hire_date, SYSDATE, emp_rec.salary,emp_rec.commission_pct, emp_rec.department_id);COMMIT;END;/
2、PLSQL内存表
PLSQL内存表即 Index By Table,这种结构类似于数组,使用主键提供类似于数组那样的元 素访问。 这种类型必须包括两部分:
1、使用 BINARY_INTEGER 类型构成的索引主键;
2、另外一个简单类型 或者用户自定义类型的字段作为具体的数组元素。 这种类型可以自动增长,所以也类似于可变长数组。
A.语法
TYPE type_name IS TABLE OF{column_type | variable%TYPE| table.column%TYPE} [NOT NULL]| table.%ROWTYPE[INDEX BY BINARY_INTEGER];identifier type_name;
...TYPE ename_table_type IS TABLE OFemployees.last_name%TYPEINDEX BY BINARY_INTEGER;ename_table ename_table_type;...
B.PLSQL内存表应用举例1
下面定义的两个内存表中的元素都是简单数据类型,所以相当于定义了两个简单数组;
DECLARETYPE ename_table_type IS TABLE OFemployees.last_name%TYPEINDEX BY BINARY_INTEGER;TYPE hiredate_table_type IS TABLE OF DATEINDEX BY BINARY_INTEGER;ename_table ename_table_type;hiredate_table hiredate_table_type;BEGINename_table(1) := 'CAMERON';hiredate_table(8) := SYSDATE + 7;IF ename_table.EXISTS(1) THENINSERT INTO ......END;/
备注:对PLSQL内存表中某个元素的访问类似于数组,可以使用下表,因为BINARY_INTEGER这种数据类型 的值在-2147483647 … 2147483647范围内,所以下表也可以在这个范围内。
C.PLSQL内存表应用举例2
下面定义的两个内存表中的元素记录类型,所以相当于定义了真正的内存表;
DECLARETYPE emp_table_type is table ofemployees%ROWTYPE INDEX BY BINARY_INTEGER;my_emp_table emp_table_type;v_count NUMBER(3):= 104;BEGINFOR i IN 100..v_countLOOPSELECT * INTO my_emp_table(i) FROM employeesWHERE employee_id = i;END LOOP;FOR i IN my_emp_table.FIRST..my_emp_table.LASTLOOPDBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);END LOOP;END;
