SQL ストアド・プロシージャの作成例

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 コマンドでコンパイルします。

[Top Pageに戻る]

Ads by TOK2