• 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;

  • 相关阅读:
    数据库事务的特性以及隔离级别
    非受检异常(运行时异常)和受检异常的区别等
    在测试crontab执行脚本的时候,修改了linux的系统时间,crontab不执行了。
    perl的foreach循环的坑
    javascript中快速求数组的全部元素的相加之和
    js 百度地图
    PHP 取前一天或后一天、一个月时间
    php截取字符串函数
    js jquery 基本元素操作
    PHP 替换标签和标签内的内容
  • 原文地址:https://www.cnblogs.com/alang85/p/2511451.html
Copyright © 2020-2023  润新知