SQL で記述したストアド・プロシージャを作成してみました。
あるテーブルを読みながら、その内容を対象にした SQL をループさせて実行する、といったようなかんじのサンプルになるかな、と思っての作成です。
CREATE PROCEDURE DELPROCS
LANGUAGE SQL
BEGIN
DECLARE PROC_NAME CHAR(10);
DECLARE LIB_NAME CHAR(10);
DECLARE PROC_NAME2 CHAR(21);
DECLARE STMT VARCHAR(128);
DECLARE NOT_FOUND CONDITION FOR SQLSTATE '02000';
DECLARE AT_END SMALLINT DEFAULT 0;
DECLARE C1 CURSOR FOR
SELECT NM, LB FROM PROCS;
DECLARE CONTINUE HANDLER FOR NOT_FOUND
SET AT_END = 1;
OPEN C1;
FETCH_LOOP:
LOOP
FETCH C1 INTO PROC_NAME, LIB_NAME;
IF AT_END <> 0 THEN
LEAVE FETCH_LOOP;
END IF;
SET PROC_NAME2 = RTRIM(LIB_NAME) CONCAT '/' CONCAT RTRIM(PROC_NAME);
SET STMT = 'DROP SPECIFIC ROUTINE ' CONCAT PROC_NAME2;
PREPARE S1 FROM STMT;
EXECUTE S1;
END LOOP FETCH_LOOP;
CLOSE C1;
END
|
あらかじめ読み込む元のテーブルを作成しておきます。
CREATE TABLE QGPL/PROCS (LB CHAR ( 10) NOT NULL WITH DEFAULT, NM CHAR ( 10) NOT NULL WITH DEFAULT) |
今回は V5R4 の iSeries Access のちょっとした問題対応のために作成したもので、実際には以下のようにある特定の名前のプロシージャを使用するプロシージャが複数登録されてしまうことによる不具合を解消するために不必要なものを削除
(DROP SPECIFIC ROUTINE) しています。
この不必要なものをテーブルに登録しておいて、それを順次読み込ませながら削除
(DROP SPECIFIC ROUTINE) する、という仕組みですね。
INSERT INTO QGPL/PROCS SELECT SPECIFIC_SCHEMA, SPECIFIC_NAME FROM qsys2/sysroutines WHERE routine_name = 'QZDGDNAV' |
RUNSQLSTM コマンドでコンパイルします。

|
|