oracle复合数据类型

处理单行单列的数据,开发人员可以使用标量变量,为了处理单行多列的数据;开发人员使用PL/SQL记录;处理单列多行数据,开发人员可以使用PL/SQL集合;处理多行多列数据,开发人员可以使用PL/SQL记录表。

oracle复合数据类型

1,使用PL/SQL记录和%ROWTYPE属性。

2,使用索引表,嵌套表和变长数组(VARRAY)。

3,使用PL/SQL记录表。

4,使用FORALL语句和BULK COLLECT子句。

5,在嵌套表上使用集合操作符,在FORALL语句中使用INDICES OF 子句和VALUES OF子句。

 

定义记录

  TYPE type_name IS RECORD (field_declaration[,field_declaration]...);
  identifier_names type_name;
  examples:
  TYPE emp_record_type IS RECORD(NAME emp.ename%TYPE,salary emp.sal%TYPE,dno emp.deptno%TYPE);
  emp_record emp_record_type;

   使用%rowtype属性可以基于表或视图定义记录变量。
  identifier_names table_name%ROWTYPE;
  identifier_names view_name%ROWTYPE;

 

在SELECT INTO语句中使用记录成员

CREATE OR REPLACE PROCEDURE pro_record2(v_empno INTEGER)
IS
TYPE emp_record_type IS RECORD(NAME emp.ename%TYPE,salary emp.sal%TYPE,dno emp.deptno%TYPE);
emp_record emp_record_type;
BEGIN
  SELECT ename,sal INTO emp_record.name,emp_record.salary FROM emp WHERE empno = v_empno;
  dbms_output.put_line(emp_record.name);
  END;

 


在VALUES语句中使用PL/SQL记录
DECLARE dept_record dept%ROWTYPE;
BEGIN
  dept_record.deptno := 50;
  dept_record.dname := 'administrator';
  dept_record.loc := 'beijing';
  INSERT INTO dept VALUES dept_record; 
  END;

 

在VALUES子句中使用记录成员

 DECLARE dept_record dept%ROWTYPE;
  BEGIN
    dept_record.deptno := 60;
    dept_record.dname := 'SALES';
    INSERT INTO dept(deptno,dname) VALUES (dept_record.deptno,dept_record.dname);
    END;

 

 ------

PL/SQL集合

PL/SQL集合类型包括索引表(PL/SQL table),嵌套表(nested table),变长数据(varray)等三种类型。

 

索引表也称PL/SQL表,元素个数没有限制,下标可以为负值。索引表只能作为PL/SQL复合数据类型使用,而不能作为表列的数据类型使用。

定义语法:


TYPE type_name IS TABLE OF element_type [NOT NULL] INDEX BY key_type;

identifier type_name;

key_type允许使用的类型binary_integer,pls_integer,varchar2,用于指定索引表元素下标的数据类型。

CREATE OR REPLACE PROCEDURE PRO_TABLE_TYPE1(V_NO IN INTEGER) IS
  TYPE ENAME_TABLE_TYPE IS TABLE OF EMP.EMPNO%TYPE INDEX BY BINARY_INTEGER;
  ENAME_TABLE_NAME ENAME_TABLE_TYPE;
BEGIN
  SELECT ENAME INTO ENAME_TABLE_NAME(-1) FROM EMP WHERE EMPNO = V_NO;
END;

 

 嵌套表的元素下标从1开始,并且元素个数没有限制。

定义语法:

TYPE type_name IS TABLE OF element_type;
identifier type_name;

 identifier为嵌套表变量。

 

变长数据(VARRAY)

 TYPE type_name IS VARRAY(size_limit) OF element_type [NOT NULL];
identifiers type_name;
size_limit用于指定varray元素的最大个数;
使用varray元素时,必须要使用其构造方法初始化varray元素。
DECLARE TYPE ename_table_type IS  VARRAY(20) OF emp.ename%TYPE;
ename_table ename_table_type := ename_table_type('A','A'); 

 

PL/SQL记录表

实例:

DECLARE
TYPE emp_table_type IS TABLE OF emp%ROWTYPE INDEX BY BINARY_INTEGER;
emp_table emp_table_type;

BEGIN
  SELECT * INTO emp_table(1) FROM emp WHERE empno = &NO;
  dbms_output.put_line('雇员姓名:'||emp_table(1).ename);
  dbms_output.put_line('雇员工资:'||emp_table(1).sal);
  END;

 

批量绑定

forall语句只使用于执行批量DML操作,BULK collect子句用于取得批量数据,该子句只能用于SELECT语句,fetch语句和
DML返回子句中。

创建的实例表:

CREATE TABLE demo(ID NUMBER(6) PRIMARY KEY,NAME VARCHAR2(10));

 批量绑定实例:

CREATE OR REPLACE PROCEDURE pro_bulk2
IS
TYPE id_table_type IS TABLE OF NUMBER(6) INDEX BY BINARY_INTEGER;
TYPE name_table_type IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
id_table id_table_type;
name_table name_table_type;

start_time NUMBER(10);
end_time NUMBER(10);

BEGIN
  FOR  i IN 1..5000 LOOP
    id_table(i) := i;
    NAME_table(i) := 'Name' || to_char(i);
        END LOOP;
    start_time := dbms_utility.get_time;
    FORALL i IN 1..id_table.count
      INSERT INTO demo VALUES(id_table(i),name_table(i));
      COMMIT;
       END_time := dbms_utility.get_time;
      dbms_output.put_line('总计时(s):' || to_char((end_time-start_time)/100));
  END;

 

 

posted @ 2012-05-21 12:15  痞子过  阅读(368)  评论(0编辑  收藏  举报