存储过程之集合(复合类型)
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
729010328@qq.com
浙公网安备 33010602011771号