DB2 存儲過程中執行動態SQL
阿新 • • 發佈:2018-07-18
values exec 退出 .... strong arch 包含 gin 使用 樣本代碼:
DROP PROCEDURE QUOTATION.COPY_SAMPLE; CREATE PROCEDURE QUOTATION.COPY_SAMPLE ( IN tableNameFrom VARCHAR(30) , IN tableNameTo VARCHAR(30) , INOUT copyResult INTEGER) BEGIN DECLARE SQLCODE INTEGER DEFAULT 0; SET copyResult = 0; -- Proecss 1 BEGIN DECLARE fromSql VARCHAR(32672); DECLARE toSql VARCHAR(32672); DECLARE templateParserId INTEGER; DECLARE uuid VARCHAR(36); DECLARE stmt STATEMENT; DECLARE curs CURSOR FOR stmt; SET fromSql = ‘SELECT TEMPLATE_PARSER_ID, UUID FROM QUOTATION.‘ || tableNameFrom; PREPARE stmt FROM fromSql; OPEN curs; CURSORLOOP: LOOP FETCH curs INTO templateParserId, uuid; -- Do nothing if no data or processed all datas. IF SQLCODE = 100 THEN LEAVE CURSORLOOP; END IF; SET toSql = ‘INSERT INTO QUOTATION.‘ || tableNameTo || ‘ (TEMPLATE_PARSER_ID, UUID) VALUES (‘ || templateParserId || ‘,‘‘‘ || uuid || ‘‘‘)‘; PREPARE s FROM toSql; EXECUTE s; END LOOP; CLOSE curs; END; -- Proecss 2 BEGIN -- ...... END; SET copyResult = 1; END;
註意點:
1、SQLCODE必須要定義,且必須定義在最外層的BEGIN的下面。
2、必須要判斷SQLCODE是否等於100,等於100時退出CURSORLOOP,否則會死循環。
3、“OPEN curs”之後不要忘記“CURSORLOOP:”。
4、在DB2中動態SQL中如果包含SELECT或者VALUES是不能直接執行的(如:以上代碼中的:PREPARE s FROM toSql;EXECUTE s;),必須使用“OPEN curs”的寫法。
DB2 存儲過程中執行動態SQL