存储过程之集合(复合类型)

1.record,table的联合使用(注:自定义的record和table类型只能在本包或本存储过程中,跨包调用会报错)
使用举例:
创建包声明:

CREATE OR REPLACE PACKAGE TEST_FUNC IS
       --声明record类型
       TYPE TEST_RECORD IS RECORD(
            ID VARCHAR2(32),
            NAME VARCHAR2(100)
       );
       --声明table
       TYPE LIST_RECORD IS TABLE OF TEST_RECORD;
       --以上类型定义在某一个过程中,则像普通声明,写在begin之前即可。
       --以上类型定义定义只是本包中有效

       --向table中插入一条记录
       PROCEDURE PROC_AZSUB_INSERT(P_LIST IN OUT LIST_RECORD, P_RECORD IN TEST_RECORD);
       --使用举例
       FUNCTION TEST_FUNC_RECORD RETURN LIST_RECORD;
       --输出测试
       FUNCTION TEST_FUNC_MAIN RETURN VARCHAR;

END TEST_FUNC;

包体定义:

CREATE OR REPLACE PACKAGE BODY TEST_FUNC IS

    --将记录插入到结果列表中
    PROCEDURE PROC_AZSUB_INSERT(P_LIST IN OUT list_record, P_RECORD IN test_record) AS
    BEGIN
        IF P_RECORD.ID IS NOT NULL THEN
            --插入一条空记录
            P_LIST.EXTEND();
            --插入数据
            P_LIST(P_LIST.COUNT) := P_RECORD;
        END IF;
    END;
    
    --测试,输出table中的name
    FUNCTION TEST_FUNC_MAIN RETURN VARCHAR AS
      RET_LIST LIST_RECORD;
      TEMP TEST_RECORD;
      RET_S VARCHAR(10000); 
    BEGIN
      RET_S:='';
      RET_LIST:= TEST_FUNC_RECORD;
      FOR I IN 1.. RET_LIST.COUNT LOOP
        TEMP:=RET_LIST(I);
        RET_S:=RET_S||TEMP.NAME||'----';
      END LOOP;
      RETURN RET_S;
    END TEST_FUNC_MAIN;

    --向table中插入数据
    FUNCTION TEST_FUNC_RECORD RETURN LIST_RECORD AS
      RET_LIST LIST_RECORD := NEW LIST_RECORD();
      TEMP TEST_RECORD;
      BEGIN 
        --插入多条数据,用BULK COLLECT INTO
        SELECT T.ID , T.NAME BULK COLLECT INTO RET_LIST
        FROM TP_STATION T WHERE T.NAME LIKE'%乐城区农行%';
        --插入单条数据用INTO
       /* SELECT T.ID , T.NAME  INTO TEMP
        FROM TP_STATION T WHERE T.NAME LIKE'%乐城区农行%' AND ROWNUM=1;*/
        --循环遍历table,下标从1开始
        FOR I IN 1 .. RET_LIST.COUNT LOOP
          TEMP:= RET_LIST(I);
          IF(TEMP.ID IS NOT NULL) THEN
              TEMP.ID:='111111111111111';
          END IF;
        END LOOP;
        --向table插入一条记录
        /*PROC_AZSUB_INSERT(RET_LIST,TEMP);*/
        RETURN RET_LIST;
    END TEST_FUNC_RECORD;
    
END TEST_FUNC;

 

2.varray使用:

--定义
type ORG_VARRAY_TYPE is VARRAY(5) of VARCHAR2(25);  
V_ORG_VARRAY ORG_VARRAY_TYPE; 

--使用
begin
     --初始化
     V_ORG_VARRAY := ORG_VARRAY_TYPE('1','2','3','4','5'); 
     --使用,同table一样,下标从1开始
     for i in 1..V_ORG_VARRAY.count loop
        --逻辑操作,用V_ORG_VARRAY(i)访问
     end loop;


end

 

posted on 2016-11-18 17:01  干饭君  阅读(1130)  评论(0)    收藏  举报

导航