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;

  • 相关阅读:
    变量在函数内外的作用域 3
    php中用大括号把?>和<?php框起来的作用
    变量在函数内外的作用域 2
    变量在函数内外的作用域
    字母大小写对变量和函数的区别
    require()和include()代码重用
    str_place()替换函数
    【开源框架】Android之史上最全最简单最有用的第三方开源库收集整理,有助于快速开发,欢迎各位网友补充完善
    android SQLite使用SQLiteOpenHelper类对数据库进行操作
    tomcat设置IP地址或者域名访问
  • 原文地址:https://www.cnblogs.com/alang85/p/2511451.html
Copyright © 2011-2022 走看看