动态游标可以遍历动态的表,
格式:
TYPE 游标类型 IS REF CURSOR; --定义一个动态游标
游标名 游标类型;
如果查询的表的数据不同的,动态变化的,这时候可以用动态游标。
需要注意的是,动态游标的定义,
在普通存储过程中:需要放在 is 后面的第一行。
动态游标通过:open 游标 for 字符串,形式使用,遍历。
CREATE OR REPLACE PROCEDURE P_TEST_SQL IS TYPE REF_CURSOR_TYPE IS REF CURSOR; --定义一个动态游标 TABLENAME VARCHAR2(200) DEFAULT 'ess_client'; V_SQL VARCHAR2(1000); MOBILE VARCHAR2(15); USRS REF_CURSOR_TYPE; BEGIN --使用连接符拼接成一条完整SQL V_SQL := 'select usrmsisdn from ' || TABLENAME || ' where rownum < 11'; --打开游标 OPEN USRS FOR V_SQL; LOOP FETCH USRS INTO MOBILE; EXIT WHEN USRS%NOTFOUND; INSERT INTO TMP (USRMSISDN) VALUES (MOBILE); END LOOP; CLOSE USRS; COMMIT; END P_TEST_SQL;
下面是一个实例
CREATE OR REPLACE PROCEDURE DDGZ1 --订单跟踪
(
P_FLAG VARCHAR, --订单类型
P_OPERATE VARCHAR, --操作类型
P_BH VARCHAR --传入的编号ID
)
IS
TYPE REF_CURSOR_TYPE IS REF CURSOR;
V_CUR_CKD REF_CURSOR_TYPE;
BEGIN
OPEN V_CUR_CKD FOR 'select v_ERP,v_DRP,v_jxsmc,v_jxs,v_DWMC,v_czr,v_jlsj from tmp_DDGZ1';
FETCH V_CUR_CKD
INTO V_ERP, V_DRP, V_JXSMC, V_JXS, V_DWMC, V_CZR, V_JZSJ;
WHILE V_CUR_CKD%FOUND
LOOP
INSERT INTO DRPDDGZJL2
(JLID, DRP, ERP, JXS, JXSMC, JLSJ, GZJL, CZR, BHID)
VALUES
(SYS_GUID(),
V_DRP,
V_ERP,
V_JXS,
V_JXSMC,
V_JZSJ,
V_DWMC || '受托代销成品库接收订单,组织发货',
V_CZR,
'出库单' || P_BH);
FETCH V_CUR_CKD
INTO V_ERP, V_DRP, V_JXSMC, V_JXS, V_DWMC, V_CZR, V_JZSJ;
END LOOP;
CLOSE V_CUR_CKD;
END;