
私はUnixとbashスクリプトに初めて触れたので、これが愚かな質問であれば教えてください。
私はUnixプラットフォームでホストされているDB2を使用する会社で働き始めましたが、その会社のデータベース(IBM Design studioで作成)には不要なスキーマがたくさんありました。私はこれらのパターンを整理したいと思い、bashスクリプトがこれを行う最善の方法であると仮定します。
私が望むのは、データベースに問い合わせてスキーマ名を取得し、ある種のコレクションに保存し、コレクションを繰り返しながら各名前に対してdropコマンドを実行することです。
DB2コマンドには問題はありませんが(私の考えでは)、スクリプトから結果を取得する方法はわかりません。
これにより、問題のスキーマ名が検索されます。
db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'"
これにより、$ SCHEMA_TO_DROP変数に名前が割り当てられたスキーマが削除されます。
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
今やるべきことは2つを一緒につなぐだけですが、どこから始めるべきかわかりませんか?
答え1
選択出力を変数に割り当ててから、forループを使用して各Schema_nameを繰り返すことができます。
/usr/bin/ksh
# Assign the output of the SELECT command to a local shell variable
SCHEMA_DROP_LIST=$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")
# Loop over each schema_name
for SCHEMA_TO_DROP in $SCHEMA_DROP_LIST
do
# Drop the schema, 1 at a time
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
done
また、db2 dropコマンドの直後に$?変数を使用してリターンコードをキャプチャし、そのリターンコード(エコーエラーコード、終了など)に従ってアクションを実行することもできます。
答え2
# POSIX shell: command substitution, bash.info 3.5.4
# Sets SCHEMA_TO_DROP to the output of balh blah..
SCHEMA_TO_DROP="$(db2 "SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'")"
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA('$SCHEMA_TO_DROP', NULL, 'ST', 'ErrorTable')"
修正する:
言及されたvisudoのようにSCHEMA_TO_DROP
キャプチャされた内容は実際にリストです。ループを使用してfor var in balh list
リストを繰り返すことができます。
使用が$?
不要な場合があります。個人的には、次||
のような論理演算を好みます&&
。
IFS='\n' # make sure that for don't split anything other then newlines
for foo in $SCHEMA_TO_DROP; do
db2 something something || oh_crap_it_failed
done
答え3
使ってみましたか?サブクエリ?次のように見えます。
db2 "CALL SYSPROC.ADMIN_DROP_SCHEMA((SELECT schemaname FROM syscat.schemata WHERE schemaname like 'IWSCHEMA%'), NULL, 'ST', 'ErrorTable')"
ただし、最初のパラメータで複数の値を処理する必要があります。