zoukankan      html  css  js  c++  java
  • PLSQL复合变量与参照变量

    PLSQL复合变量与参照变量

    PLSQL复合变量

        复合变量指用于存放多个值的变量。定义复合变量时,必须要使用PL/SQL的复合数据类型。PL/SQL包括
    PL/SQL记录、PL/SQL表、嵌套表及VARRAY等四种复合数据类型。

    1、PLSQL记录
        每个PL/SQL记录一般都包含多个成员,当使用PL/SQL记录时,需要注意在定义部分定义记录类型和记录变量,然后在执行部分引用该记录变量。
    实例:
          DECLARE
           TYPE emp_record_type IS RECORD(
            name emp.ename%TYPE,
            salary emp.sal%TYPE,
            title emp.job%TYPE);    
           emp_record emp_record_type;
           BEGIN
             SELECT ename,sal,job INTO emp_record FROM emp WHERE empno=7788;
             dbms_output.put_line('雇员名:'||emp_record.name);
           END;
    注:emp_record_type是记录类型,emp_record是记录变量,emp_record.name表示引用记录变量emp_record的成员name。

    2、PL/SQL表(索引表)
        与高级语言数组不同,PL/SQL表的元素个数没有限制,并且其下标没有上下限。当使用PL/SQL表时,必须先在定义部分定义PL/SQL表类型和PL/SQL
    表变量,然后在执行部分引用该PL/SQL表变量。
    实例:
        DECLARE
         TYPE ename_table_type IS TABLE OF emp.ename%TYPE INDEX BY BINARY_INTEGER;
         ename_table ename_table_type;
        BEGIN
          SELECT ename INTO ename_table(-1) FROM emp WHERE empno=7788;
          dbms_output.put_line('雇员名:'||ename_table(-1))  ;
        END;
    注:ename_table_type表示表类型;emp.ename%TYPE指定了PL/SQL表元素的数据类型和长度;ename_table表示表变量;ename_table(-1)表示下标
    为-1的元素。

        从oracle9i开始,PL/SQL表的下标除了可以使用 BINARY_INTEGER 和 PLS_INTEGER 外,还可以是 VARCHAR2 型。
      DECLARE
        TYPE area_table_type IS TABLE OF NUMBER INDEX BY VARCHAR2(10);
        area_table area_table_type;
      BEGIN
        area_table('北京') := 1;
        area_table('上海') := 2;
        area_table('广州') := 3;
        dbms_output.put_line('第一个元素:' || area_table.first);
        dbms_output.put_line('第一个元素:' || area_table.last);
      END;
    第一个元素:北京
    第一个元素:上海

    3、嵌套表
       嵌套表类似于高级语言数组。需要注意,高级语言和嵌套表的下标都不能为负值;高级语言数组元素个数有限制,但嵌套表的元素个数没有限制。
    嵌套表与PL/SQL表非常相似,但嵌套表可以作为表列的数据类型,而PL/SQL表不能作为表列的数据类型。当在表中使用嵌套表时,必须先使用
    CREATE TYPE语句建立嵌套表类型。
    实例:
     CREATE OR REPLACE TYPE emp_type AS OBJECT(
      name VARCHAR2(10),salary NUMBER(6,2),hiredate DATE);--创建对象类型
     CREATE OR REPLACE TYPE emp_array IS TABLE OF emp_type;--创建嵌套表类型

    (或者直接创建一个嵌套表类型 CREATE OR REPLACE TYPE tt_type IS TABLE OF varchar2(20))
    --在PL/SQL块中使用嵌套表类型
    当在PL/SQL块中使用嵌套表变量时,必须首先使用构造方法初始化嵌套表变量,然后才能在PL/SQL块内引用嵌套表元素。
    DECLARE
      TYPE ename_table_type IS TABLE OF emp.ename%type;
      ename_table ename_table_type;
    BEGIN
      ename_table:=ename_table_type('MARY','MARY','MARY');
      SELECT ename INTO ename_table(2) FROM emp WHERE empno=&no;
      dbms_output.put_line('雇员名:'||ename_table(2));
    END;
     --ename_table_type()为构造方法
     
     --在表列中使用嵌套表
     CREATE TABLE department(
       deptno NUMBER(2),dname VARCHAR2(10),employee emp_array
       ) NESTED TABLE employee STORE AS employee;--当使用嵌套表类型作为表列时必须指定专门的存储表

    4、VARRAY
        VARRAY类似于嵌套表,它可以作为表列和对象类型属性的数据类型。但是需要注意,嵌套表的元素个数没有限制,而VARRAY得元素个数是有限制的。
    使用VARRAY时,必须先建立VARRAY类型。与嵌套表类似,在PL/SQL块中使用时,必须先使用构造方法初始化数组变量,然后才能在PL/SQL块内引用数组元素。
    实例:
       CREATE TYPE article_type AS OBJECT(
       title VARCHAR2(30),pubdate DATE
       );
       CREATE TYPE article_array IS VARRAY(20) OF article_type;
       当建立了VARRAY类型之后,可以在表列或对象属性中将其作为用户自定义数据类型来引用:
       CREATE TABLE author(
        id NUMBER(6),name VARCHAR2(10),article article_array
        );
    --注:嵌套表数据需要存储在专门的存储表中,而VARRAY数据则与其他列数据一起存放在表段中。

    参照变量

        参照变量指用于存放数值指针的变量。通过使用参照变量,可以使得应用程序共享相同对象,降低占用空间。在编写Pl/sql程序时,可以使用游标
    变量(REF CURSOR)和对象类型变量REF obj_type等两种参照变量类型。
      1、REF CURSOR
          当使用显式游标时,需要在定义显式时指定相应的SELECT语句,这种显式游标称为静态游标。当使用变量变量时,定义游标变量时不需要指定
    SELECT语句,而是在打开游标时指定SELECT语句,从而实现动态的游标操作。
     实例:
       DECLARE
        type cl IS REF CURSOR;
        emp_cursor cl;
        v_ename emp.ename%TYPE;
        v_sal emp.sal%TYPE;
       BEGIN
        OPEN emp_cursor FOR
         SELECT ename,sal FROM emp WHERE deptno=10;
        LOOP
          FETCH emp_cursor INTO v_ename,v_sal;
          EXIT WHEN emp_cursor%NOTFOUND;
          dbms_output.put_line(v_ename);
        END LOOP;
        CLOSE emp_cursor;
       END;     
      注:cl为 REF CURSOR类型,而emp_cursor 为游标变量,并且再打开游标时指定了其对应的SELECT语句。
     
     2、REF obj_type
        当编写对象类型应用时,为了共享相同对象,可以使用REF引用对象类型,REF实际是指向对象实例的指针。
     实例:
       CREATE OR REPLACE TYPE home_type AS OBJECT(
       street VARCHAR2(50),city VARCHAR2(20),state VARCHAR2(20),zipcode VARCHAR2(6),owner VARCHAR2(10)
       );
       CREATE TABLE homes OF home_type;--利用对象类型创建了对象表homes
       
       CREATE TABLE person(
       id NUMBER(6) PRIMARY KEY,
       name VARCHAR2(10),addr REF home_type --引用对象
       );
      

  • 相关阅读:
    fastjson(转)
    FastJson
    FastJson处理Map List 对象
    spring-data-redis RedisTemplate操作
    Spring-data-redis:特性与实例(转载)
    Spring Boot 支持多种外部配置方式
    springBoot----@ConditionalOnxxx相关注解总结
    Centos7 install Openstack
    Centos7 install Openstack
    Centos7 Openstack
  • 原文地址:https://www.cnblogs.com/lanzi/p/1999790.html
Copyright © 2011-2022 走看看