データベースの構築時に、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;