1、PLSQL中的复杂自定义数据类型

PLSQL中常用的自定义类型就两种:记录类型、PLSQL内存表类型(根据表中的数据字段的简单和复杂 程度又可分别实现类似于简单数组和记录数组的功能)

A.类型定义的语法

  1. TYPE type_name IS RECORD
  2. (field_declaration[, field_declaration]…);
  3. identifier type_name;
  4. #这里的field_declaration 的具体格式可以是
  5. field_name {field_type | variable%TYPE
  6. | table.column%TYPE | table%ROWTYPE}
  7. [[NOT NULL] {:= | DEFAULT} expr]
  1. ...
  2. TYPE emp_record_type IS RECORD
  3. (last_name VARCHAR2(25),
  4. job_id VARCHAR2(10),
  5. salary NUMBER(8,2));
  6. emp_record emp_record_type;
  7. ...

B.%ROWTYPE属性

%ROWTYPE属性:在PLSQL中 %ROWTYPE 表示某张表的记录类型 或者是用户指定以的记录类型,使用此 属性可以很方便的定义一个变量,其类型与某张表的记录或者自定义的记录类型保持一致。极大的方便了 select * into ….的语句使用

  1. DECLARE
  2. emp_rec employees%ROWTYPE;
  3. BEGIN
  4. SELECT * INTO emp_rec
  5. FROM employees
  6. WHERE employee_id = &employee_number;
  7. INSERT INTO retired_emps(empno, ename, job, mgr, hiredate,
  8. leavedate, sal, comm, deptno)
  9. VALUES (emp_rec.employee_id, emp_rec.last_name, emp_rec.job_id,
  10. emp_rec.manager_id, emp_rec.hire_date, SYSDATE, emp_rec.salary,
  11. emp_rec.commission_pct, emp_rec.department_id);
  12. COMMIT;
  13. END;
  14. /

2、PLSQL内存表

PLSQL内存表即 Index By Table,这种结构类似于数组,使用主键提供类似于数组那样的元 素访问。 这种类型必须包括两部分:
1、使用 BINARY_INTEGER 类型构成的索引主键;
2、另外一个简单类型 或者用户自定义类型的字段作为具体的数组元素。 这种类型可以自动增长,所以也类似于可变长数组。

A.语法

  1. TYPE type_name IS TABLE OF
  2. {column_type | variable%TYPE
  3. | table.column%TYPE} [NOT NULL]
  4. | table.%ROWTYPE
  5. [INDEX BY BINARY_INTEGER];
  6. identifier type_name;
  1. ...
  2. TYPE ename_table_type IS TABLE OF
  3. employees.last_name%TYPE
  4. INDEX BY BINARY_INTEGER;
  5. ename_table ename_table_type;
  6. ...

B.PLSQL内存表应用举例1

下面定义的两个内存表中的元素都是简单数据类型,所以相当于定义了两个简单数组;

  1. DECLARE
  2. TYPE ename_table_type IS TABLE OF
  3. employees.last_name%TYPE
  4. INDEX BY BINARY_INTEGER;
  5. TYPE hiredate_table_type IS TABLE OF DATE
  6. INDEX BY BINARY_INTEGER;
  7. ename_table ename_table_type;
  8. hiredate_table hiredate_table_type;
  9. BEGIN
  10. ename_table(1) := 'CAMERON';
  11. hiredate_table(8) := SYSDATE + 7;
  12. IF ename_table.EXISTS(1) THEN
  13. INSERT INTO ...
  14. ...
  15. END;
  16. /

备注:对PLSQL内存表中某个元素的访问类似于数组,可以使用下表,因为BINARY_INTEGER这种数据类型 的值在-2147483647 … 2147483647范围内,所以下表也可以在这个范围内。

C.PLSQL内存表应用举例2

下面定义的两个内存表中的元素记录类型,所以相当于定义了真正的内存表;

  1. DECLARE
  2. TYPE emp_table_type is table of
  3. employees%ROWTYPE INDEX BY BINARY_INTEGER;
  4. my_emp_table emp_table_type;
  5. v_count NUMBER(3):= 104;
  6. BEGIN
  7. FOR i IN 100..v_count
  8. LOOP
  9. SELECT * INTO my_emp_table(i) FROM employees
  10. WHERE employee_id = i;
  11. END LOOP;
  12. FOR i IN my_emp_table.FIRST..my_emp_table.LAST
  13. LOOP
  14. DBMS_OUTPUT.PUT_LINE(my_emp_table(i).last_name);
  15. END LOOP;
  16. END;