ページの先頭行へ戻る
Symfoware Server V12.3.0 SQLTOOLユーザーズガイド
FUJITSU Software

2.2.10 SQL文でのエラー発生時の対処

データベースの構築時に、rdbexecsqlコマンドにeオプションまたはexオプションを指定することにより、入力したSQL文の実行中にエラーが発生した場合に処理を中断し、SQL文でエラーが発生したことを表す値を返却します。

これにより、rdbexecsqlコマンドでエラーが発生した場合に、エラー内容によって利用者が処理を切り分けることが可能です。

eオプションを指定した場合、SQL文の実行中にエラーが発生すると、エラーの種類に関わらず処理が中断されます。

exオプションを指定した場合、未定義オブジェクトの削除エラー、定義済みオブジェクトの重複定義エラーまたは一意性制約違反のエラーが発生した場合は正常終了とみなされ、処理は継続されます。このため、データベースを一括して再定義する場合に、重複定義エラーや未定義エラーを抑止し、次の定義文へ処理を継続させることが可能となります。

以下にrdbexecsqlコマンドにexオプションを指定して、シェルスクリプトを利用してデータベースを構築する例(UNIX系の場合)を示します。

処理の概要は以下のとおりです。

  1. データベースの構築
    rdbexecsqlコマンドにiオプションを指定し、データベースの構築用のDDLファイルを読み込ませることにより、データベースの構築を行います。
    その際、エラー発生時に備えて、標準出力をテキストファイルに出力しておきます。
    データベースの構築では、メモリ不足などのエラーが発生して、データベースの構築を再実行するときに、初期データが重複して挿入されてしまうことを防ぐために、はじめに格納構造の削除を行います。すべての表にPRIMARY KEYを定義する場合は、初期データの重複は発生しないため、格納構造の削除は必要ありません。

  2. データベースの構築の成否判定
    rdbexecsqlコマンドの終了ステータスを取得することにより、データベースの構築が成功したか否かを判定します。

  3. エラー内容の確認
    rdbexecsqlコマンドの標準出力の最終行にエラーメッセージが出力されていますので、エラーの内容を確認します。

  4. エラーに対する対処の選択
    データベースの構築を中断するか、エラーの原因を取り除いてデータベースの構築を再実行するかを選択します。

  5. 不要な資源の削除
    データベースの構築を中断する場合、rdbexecsqlコマンドにiオプションを指定し、データベースの削除用のDDLファイルを読み込ませることにより、不要な資源の削除を行います。

データベースを構築するシェルスクリプトの例(bashの場合)

#!/bin/bash

# セットアップ開始
INPUT=Y
while [ "$INPUT" = "Y" ]
do
    rdbexecsql -s RDBDB -i /home/user/createdb.dat -ex > dbsetuplog.txt 2>&1
    if [ $? -eq 0 ]
    then
        echo "データベースの作成が完了しました。"
        exit
    else
        echo "データベースの作成でエラーが発生しました。"
        echo "再実行する場合は以下のメッセージの対処を実行してからYキーを入力してください。"
        echo "データベースの作成を中断する場合はY以外のキーを入力してください。"

        # エラーメッセージを表示
        echo "エラー内容"
        tail -1 dbsetuplog.txt

        # ユーザからの入力を読み込み
        read INPUT
    fi
done

# セットアップの中断
echo "セットアップを中断します。"

echo "データベースを削除します。"
rdbexecsql -s RDBDB -i /home/user/dropdb.dat -ex >> dbsetuplog.txt 2>&1
if [ $? -eq 0 ]
then
    echo "データベースの削除が完了しました。"
else
    echo "データベースの削除でエラーが発生しました。"
    # エラーメッセージを表示
    echo "エラー内容"
    tail -1 dbsetuplog.txt
    # データベースの資源の回収処理
fi

データベースの構築に使用するDDLファイル(createdb.dat)の例

-- データベース名の登録 データベース名は“RDBDB”
CREATE DATABASE RDBDB;

-- データベーススペースの作成 DDLの実行
-- データベーススペース定義 データベーススペース名は“DBSPACE1”
CREATE DBSPACE DBSPACE1 ALLOCATE FILE /home/rdbdps/DBSPACE1 ATTRIBUTE SPACE (100M);

-- 論理構造の定義
-- スキーマを定義 スキーマ名は“STOCKS”
CREATE SCHEMA STOCKS;

-- テーブルを定義
CREATE TABLE STOCKS.在庫表 ( 製品番号 SMALLINT NOT NULL,
製品名 NATIONAL CHARACTER(10) NOT NULL,
在庫数量 INTEGER,
倉庫番号 SMALLINT,
PRIMARY KEY (製品番号)
);
CREATE TABLE STOCKS.アンケート (回答 CHARACTER VARYING(100));
CREATE VIEW STOCKS.大量在庫表(品番,数量)
AS SELECT 製品番号, 在庫数量 FROM STOCKS.在庫表
WHERE 在庫数量 >= 50;

-- 格納構造の定義
CREATE DSO 在庫表DSO
FROM STOCKS.在庫表
TYPE SEQUENTIAL(PAGESIZE(4),ORDER(1));
CREATE DSO アンケートDSO
FROM STOCKS.アンケート
TYPE SEQUENTIAL(PAGESIZE(4),ORDER(1));

-- DSIの定義の削除
DROP DSI 製品番号IXDSI;
DROP DSI 在庫表DSI;
DROP DSI アンケートDSI;

-- DSIのフォーマット指定
CREATE DSI 在庫表DSI
DSO 在庫表DSO
ALLOCATE DATA ON DBSPACE1 SIZE 280K,
FORMAT;
CREATE DSI アンケートDSI
DSO アンケートDSO
ALLOCATE DATA ON DBSPACE1 SIZE 280K,
FORMAT;

-- インデックスのDSO
CREATE DSO 製品番号IXDSO
INDEX ON STOCKS.在庫表 (製品番号)
TYPE BTREE ( PAGESIZE1(16),PAGESIZE2(1), REALIGNMENT) BY ADDRESS;

-- インデックスのDSI
-- DSIのフォーマット指定
CREATE DSI 製品番号IXDSI
INDEX
DSO 製品番号IXDSO
ALLOCATE BASE ON DBSPACE1 SIZE 200K,
INDEX ON DBSPACE1 SIZE 40K,
FORMAT;

-- その他の定義
-- プロシジャを定義
EXEC SQL
CREATE PROCEDURE STOCKS.PROC001 ( IN KEY1 INTEGER )
COMMENT '在庫不足の製品の発注依頼'
BEGIN
DECLARE 在庫数量変数 INTEGER;
SELECT 在庫数量 INTO 在庫数量変数 FROM STOCKS.在庫表;
END
END-EXEC;

-- データベースの創成 DMLの実行
-- データのINSERT
INSERT INTO STOCKS.在庫表 (製品番号,製品名,在庫数量,倉庫番号) VALUES (110,N'テレビ',86,2);
INSERT INTO STOCKS.在庫表 (製品番号,製品名,在庫数量,倉庫番号) VALUES (112,N'ビデオ',95,3);

INSERT INTO STOCKS.アンケート (回答) VALUES('回答のサンプルです');

データベースの削除に使用するDDLファイル(dropdb.dat)の例

--  その他の定義の削除
--  プロシジャを削除
DROP PROCEDURE STOCKS.PROC001;


--  格納構造の定義の削除
DROP DSI 製品番号IXDSI;
DROP DSO 製品番号IXDSO;

DROP DSI アンケートDSI;
DROP DSI 在庫表DSI;
DROP DSO アンケートDSO;
DROP DSO 在庫表DSO;

--  テーブル定義の削除
DROP VIEW   STOCKS.大量在庫表;
DROP TABLE  STOCKS.アンケート;
DROP TABLE  STOCKS.在庫表;

--  スキーマ定義の削除  スキーマ名は"STOCKS"
DROP SCHEMA STOCKS;

--  データベーススペース定義の削除  データベーススペース名は"DBSPACE1"
DROP DBSPACE DBSPACE1;

--  データベースの削除  データベース名は"RDBDB"
CONNECT TO 'RDBII_DICTIONARY';
DROP DATABASE RDBDB;