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

eオプションを指定した場合、SQL文の実行中にエラーが発生すると、エラーの種類に関わらず処理が中断されます。
exオプションを指定した場合、未定義オブジェクトの削除エラー、定義済みオブジェクトの重複定義エラーまたは一意性制約違反のエラーが発生した場合は正常終了とみなされ、処理は継続されます。このため、データベースを一括して再定義する場合に、重複定義エラーや未定義エラーを抑止し、次の定義文へ処理を継続させることが可能となります。
以下にrdbexecsqlコマンドにexオプションを指定して、シェルスクリプトを利用してデータベースを構築する例(UNIX系の場合)を示します。
処理の概要は以下のとおりです。
データベースの構築
rdbexecsqlコマンドにiオプションを指定し、データベースの構築用のDDLファイルを読み込ませることにより、データベースの構築を行います。
その際、エラー発生時に備えて、標準出力をテキストファイルに出力しておきます。
データベースの構築では、メモリ不足などのエラーが発生して、データベースの構築を再実行するときに、初期データが重複して挿入されてしまうことを防ぐために、はじめに格納構造の削除を行います。すべての表にPRIMARY KEYを定義する場合は、初期データの重複は発生しないため、格納構造の削除は必要ありません。
データベースの構築の成否判定
rdbexecsqlコマンドの終了ステータスを取得することにより、データベースの構築が成功したか否かを判定します。
エラー内容の確認
rdbexecsqlコマンドの標準出力の最終行にエラーメッセージが出力されていますので、エラーの内容を確認します。
エラーに対する対処の選択
データベースの構築を中断するか、エラーの原因を取り除いてデータベースの構築を再実行するかを選択します。
不要な資源の削除
データベースの構築を中断する場合、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;