Symfoware Server アプリケーション開発ガイド(埋込みSQL編) - FUJITSU -
目次 索引 前ページ次ページ

第4章 ルーチンを利用するアプリケーションの作成> 4.1 プロシジャルーチンを利用する場合

4.1.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コマンを実行してプロシジャルーチンを登録します。rdbddlexコマンドでプロシジャルーチンを定義する場合、 注釈を指定することができます。

定義ファイルからプロシジャルーチンを登録す例と定義ファイルの例を以下に示します。

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

定義ファイルからプロシジャルーチンを登録する例

  rdbddlex  -d  RDBDB   -x /home/rdb/DDL/ddl.dat
                                    ↑
                              入力ファイル指定

[定義ファイル(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;

上記の例の入力ファイル指定が、“C:\USERS\DEFAULT\DDL.DAT”のような形式になります。


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

All Rights Reserved, Copyright(C) 富士通株式会社 2007-2008