zoukankan      html  css  js  c++  java
  • 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;

  • 相关阅读:
    How to provide highlighting with Spring data elasticsearch
    Android——仿QQ聊天撒花特效
    Android 仿新版QQ的tab下面拖拽标记为已读的效果
    GitHub控件之BadgeView(数字提醒)
    Android之基于百度云推送IM
    Android消息推送完美解决方案全析
    android asmack 注册 登陆 聊天 多人聊天室 文件传输
    android:TextAppearance.Material.Widget.Button.Inverse问题
    Android 高仿微信实时聊天 基于百度云推送
    Gradle DSL method not found: 'android()
  • 原文地址:https://www.cnblogs.com/alang85/p/2511451.html
Copyright © 2011-2022 走看看