Symfoware Parallel Server RDBユーザーズガイド 応用プログラム開発編
目次 索引 前ページ次ページ

第3章 プロシジャを利用する応用プログラムの作成方法

3.3 プロシジャルーチンの定義

プロシジャをスキーマに登録するには、図:プロシジャルーチン定義文の指定方法に示すプロシジャルーチン定義文を使用します。

[図:プロシジャルーチン定義文の指定方法]

  CREATE PROCEDURE  SCM.RNAME (    IN      PARA        INT)       
                    (1)  (2)       (3)      (4)        (5)
    BEGIN                                                   
      DECLARE VAR   INT;                                          
      SET VAR = PARA + 1;                                         
      INSERT INTO SCM.TBL(ITEM) VALUES(VAR);                      
                〜                                                
    END                                                           

(1) スキーマ名

(2) ルーチン名

(3) パラメタモード

(4) パラメタ名

(5) データ型

プロシジャルーチンで定義できるSQL文をSQL手続きと呼びます。プロシジャルーチンはSQL手続き文を組み合わせることで、アプリケーションロジックのルーチンの開発を行います。SQL手続き文には以下のSQL文があります。

SQL制御文の詳細については、“SQLリファレンスガイド”を参照してください。

図:プロシジャルーチンの定義例に、プロシジャルーチンの定義例を示します。

プロシジャルーチン定義をファイルに作成し、サーバ側でrdbddlexコマンドを実行してプロシジャルーチンを登録します。

在庫表から、在庫数量が50以下の製品に対する発注を、倉庫番号によって営業所別のテーブルに振り分けます。

[図:プロシジャルーチンの定義例]

入力ファイル(ファイル名 = /home/rdb/DDL/ddl.dat)                                     
*******************************************
|EXEC SQL                                                                          |
|  CREATE PROCEDURE 在庫管理.営業所別発注処理(IN 検索キー INT)                     |
|    BEGIN                                                                         |
|      -- SQL変数宣言                                                              |
|        DECLARE   製品番号V   SMALLINT;                                          |
|        DECLARE   製品名V     NCHAR(10);                                         |
|        DECLARE   在庫数量V   INT;                                               |
|        DECLARE   倉庫番号V   SMALLINT;                                          |
|        DECLARE   数量V       INT;                                               |
|        DECLARE   SQLSTATE     CHAR(5);                                           |
|               〜                                                                 |
|                                                                                  |
|      -- カーソル宣言                                                             |
|      DECLARE CUR1 CURSOR FOR                                                     |
|         SELECT 製品番号, 製品名, 在庫数量, 倉庫番号 FROM 在庫管理.在庫表;        |
|                                                                                  |
|      DECLARE CUR2 CURSOR FOR                                                     |
|         SELECT 取引先, 取引製品, 発注数量 FROM 在庫管理.発注表;                  |
|                                                                                  |
|               〜                                                                 |
|                                                                                  |
|      -- 検索キーに1が指定された場合,CUR1に対する検索と補充テーブルのINSERTを行う.|
|      IF 検索キー = 1 THEN                                                        |
|        OPEN CUR1;                                                                |
|        LABEL1:                                                                   |
|        -- データが終了するまでデータを検索する.                                  |
|        LOOP                                                                      |
|          FETCH CUR1 INTO 製品番号V,製品名V,在庫数量V,倉庫番号V;           |
|          IF SQLSTATE <> '00000' THEN                                             |
|            LEAVE LABEL1;                                                         |
|          END IF;                                                                 |
|          -- 在庫数量が50以下の場合, 補充データの作成を行う.                     |
|          IF 在庫数量V<= 50 THEN                                                 |
|            -- 補充の数量を算出する.                                             |
|            SET 数量V= 50 - 在庫数量V;                                          |
|            -- 倉庫番号によって発注先のテーブルを変更する.                       |
|            IF 倉庫番号V= 2 THEN                                                 |
|              INSERT INTO 在庫管理.営業所2(製品番号, 製品名, 数量)               |
|                                      VALUES(製品番号V,製品名V,数量V);       |
|              IF SQLSTATE <> '00000' THEN                                         |
|                LEAVE LABEL1;                                                     |
|              END IF;                                                             |
*******************************************
*******************************************
|            ELSE                                                                  |
|              INSERT INTO 在庫管理.営業所1(製品番号, 製品名, 数量)               |
|                                      VALUES(製品番号V,製品名V,数量V);       |
|              IF SQLSTATE <> '00000' THEN                                         |
|                LEAVE LABEL1;                                                     |
|              END IF;                                                             |
|            END IF;                                                               |
|          END IF;                                                                 |
|        END LOOP LABEL1;                                                          |
|                                                                                  |
|      -- 検索キーに2が指定された場合, CUR2に対する処理を行う.                    |
|      ELSEIF 検索キー = 2 THEN                                                    |
|        OPEN CUR2;                                                                |
|                                                                                  |
|               〜                                                                 |
|                                                                                  |
|      END IF;                                                                     |
|    END                                                                           |
|END-EXEC;                                                                         |
*******************************************
                                      |ファイルを入力にしてrdbddlexコマンド実行      
                                      ↓                                              
 rdbddlex -d RDBDB -x /home/rdb/DDL/ddl.dat                                           
備考.rdbddlexコマンドでプロシジャルーチンを定義する場合、 注釈を指定することができます。

目次 索引 前ページ次ページ

All Rights Reserved, Copyright(C) 富士通株式会社 2006