二、oracle存储过程中的数据结构

create or replace package TEST_DATATYPE is

  TYPE MYRECORD IS RECORD(
    V_ID        A_LOG.ID%TYPE,
    V_PROC_NAME A_LOG.PROCE_NAME%TYPE,
    V_LOG_LEVEL A_LOG.LOG_LEVEL%TYPE,
    V_LOG_INFO  A_LOG.LOG_INFO%TYPE);

  PROCEDURE DATATYPE;

  FUNCTION TEST_RETURN_RECORD RETURN MYRECORD;

end TEST_DATATYPE;
create or replace package body TEST_DATATYPE is

  PROCEDURE DATATYPE IS
    --1、表的列
    /* 我真是个傻逼,为什么在临分处理的时候要定义那么多变量,
    直接用这种数据类型不就完了吗*/
    TABLEROW_A_LOG A_LOG%ROWTYPE;
    --2、记录类型record
    /* 记录类型跟上面的rowtype有很大的区别吗,感觉在用法上可以替代;
    函数的返回值可以是record类型的
    */
    RECORD1 MYRECORD;
    --3、数组类型array 和 varray(varray与array在以下用法上完全相同)
    /* 3.1、声明和初始化可以分开
       3.2、初始化的长度就是实际长度,该长度不能超过定义时的长度
       3.3、在初始化的基础上进行长度扩充时,必须先用extend
       3.4、扩充之后的长度不得超过定义时的长度
       3.5、扩充之后的值默认为空
    */
    TYPE MYARR IS ARRAY(7) OF VARCHAR2(10); --定义
    ARR1 MYARR; --声明
    ARR2 MYARR := MYARR('A', 'B', 'C');
    ---4、table  分为加INDEX BY BINARY_INTEGER和不加INDEX BY BINARY_INTEGER两种
    /* 4.1、声明和初始化
            没加:声明和初始化可以分开
            加:  只能进行声明,不能初始化,赋值只能按下标一个一个赋值
       4.2、扩充
            没加:扩充必须要先用extend
            加:直接按下标赋值即可
       注:团险拆分责任的时候应该用加了index的table来存储找到的责任
    */
    TYPE MYTABLE IS TABLE OF VARCHAR2(10);
    TABLE1 MYTABLE := MYTABLE('1', '2');
    TABLE2 MYTABLE;
    TYPE MYTABLE2 IS TABLE OF VARCHAR2(10) INDEX BY BINARY_INTEGER;
    TABLE4 MYTABLE2;
    --5、table  加index by varchar2(32)
    /* 4.1、只能进行声明,不能初始化
       4.2、有自己特殊的赋值方式
       4.3、key值唯一
       4.4、有自己特殊的遍历方式
    */
    TYPE MYTABLE_VAR IS TABLE OF VARCHAR2(32) INDEX BY VARCHAR2(10);
    TABLE5 MYTABLE_VAR;
    V_KEY VARCHAR2(10);
  BEGIN
    --2、记录类型测试
    RECORD1 := TEST_RETURN_RECORD;
    DBMS_OUTPUT.PUT_LINE(RECORD1.V_ID);
    --3、数据array测试
    DBMS_OUTPUT.PUT_LINE('数组测试');
    ARR1 := MYARR('1', '2'); --初始化
    ARR1.EXTEND; --长度扩充
    ARR1(3) := '5';
    ARR1.EXTEND;
    DBMS_OUTPUT.PUT_LINE('数组定长:' || ARR1.LIMIT);
    DBMS_OUTPUT.PUT_LINE('数组实际长度:' || ARR1.COUNT);
    DBMS_OUTPUT.PUT_LINE('数组首位元素下标:' || ARR1.FIRST);
    DBMS_OUTPUT.PUT_LINE('数组末位元素下标:' || ARR1.LAST);
    FOR I IN 1 .. ARR1.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE(ARR1(I));
    END LOOP;
    FOR I IN 1 .. ARR2.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE(ARR2(I));
    END LOOP;
    --4、table测试
    DBMS_OUTPUT.PUT_LINE('table测试');
    DBMS_OUTPUT.PUT_LINE('table定长:' || TABLE1.LIMIT);
    DBMS_OUTPUT.PUT_LINE('table实际长度:' || TABLE1.COUNT);
    DBMS_OUTPUT.PUT_LINE('table首位元素下标:' || TABLE1.FIRST);
    DBMS_OUTPUT.PUT_LINE('table末位元素下标:' || TABLE1.LAST);
    --4、1、初始化
    TABLE2 := MYTABLE('A', 'B', 'C', 'D');
    --4.2、增加值
    TABLE1.EXTEND(2);
    TABLE1(4) := '4';
    FOR I IN 1 .. TABLE1.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE(TABLE1(I));
    END LOOP;
    FOR I IN 1 .. TABLE2.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE(TABLE2(I));
    END LOOP;
    TABLE4(1) := 'a';
    TABLE4(2) := 'b';
    FOR I IN 1 .. TABLE4.COUNT LOOP
      DBMS_OUTPUT.PUT_LINE(TABLE4(I));
    END LOOP;
    --5、table测试
    TABLE5('KEY1') := 'KEY1';
    TABLE5('KEY1') := 'KEY11';
    TABLE5('KEY3') := 'KEY13';
    V_KEY := TABLE5.FIRST;
    LOOP
      DBMS_OUTPUT.PUT_LINE(V_KEY || '--->' || TABLE5(V_KEY));
      V_KEY := TABLE5.NEXT(V_KEY);
      EXIT WHEN V_KEY IS NULL;
    END LOOP;
  END DATATYPE;

  FUNCTION TEST_RETURN_RECORD RETURN MYRECORD IS
    RECORD1 MYRECORD;
  BEGIN
    SELECT A.ID, A.PROCE_NAME, A.LOG_LEVEL, A.LOG_INFO
      INTO RECORD1
      FROM A_LOG A
     WHERE ROWNUM = 1;
    RETURN RECORD1;
  END TEST_RETURN_RECORD;
end TEST_DATATYPE;

猜你喜欢

转载自blog.csdn.net/qq_37661639/article/details/89708660
今日推荐