2

スキーマ内の複数のテーブルを変更する必要があります。たとえば、接頭辞が付いているすべてのテーブルについては、次のようになります。

ALTER TABLE "SCHEMA"."TABLE1"
ADD ( "COLUMN1"   CHARACTER(4)  NOT NULL    DEFAULT 'DATA',
    "COLUMN2"   VARCHAR(16)     NOT NULL    DEFAULT 'MORE_DATA',
);

SCHEMA.table1、SCHEMA.table2...などの複数のテーブルを反復処理するためにこれが必要です。スキーマには約800のテーブルがあります。

使用できるワイルドカードがあるかどうか疑問に思いました。システムテーブルからカーソルを作成することを検討していましたが、もっと簡単な方法があるはずです。

4

4 に答える 4

3

このような場合、DBMS が簡単な方法を提供しない場合、私がよく行うのは、それを実行するスクリプトを単純に作成することです。何かのようなもの:

db2 "select tbname from sysibm.systables where schema = 'SCHEMA'" >tblist
# Edit tblist here to remove headers and such.
for t in $(cat tblist) ; do
    db2 "alter table SCHEMA.${t} add ..."
done

これはbash型の形式です。使用するスクリプト ツールに合わせて調整する必要があります。

于 2010-07-19T02:28:13.113 に答える
1

皆様のご意見をお寄せいただきありがとうございます。

CURSOR と while ループを使用してテーブルを反復処理する (と思った) 手の込んだ手順を作成した後、select ステートメントから各テーブルの ALTER クエリを作成するのは 1 回限りなので、次のように決めました。

SELECT DISTINCT 'ALTER TABLE '
          || 'CTP0610'
          || '.'
          || name
          || ' ADD COLUMN SOURCE_SYSTEM_CODE CHAR(4) NOT NULL DEFAULT ''CCR'' '
          || ' ADD COLUMN RECORD_TYPE VARCHAR(16) NOT NULL DEFAULT ''INSERT'' '
          || ' ADD COLUMN COMMIT_TIMESTAMP TIMESTAMP NOT NULL DEFAULT '
          || ' ADD COLUMN EXTRACT_TIMESTAMP TIMESTAMP NOT NULL DEFAULT; '
    FROM sysibm.systables
    WHERE (NAME LIKE 'CCTL_%')
    OR (NAME LIKE 'CCX_%')
    OR (NAME LIKE 'CC_%');

結果のクエリをクエリ ウィンドウに貼り付けて実行したところ、約 1500 のテーブルであることが判明しました。私は時々、最も洗練されていない解決策で十分だと思います:-)

于 2010-07-20T02:40:42.020 に答える
0

文書化されていない を使用しsp_MSforeachTableます。そのために、 Googleで多くのヘルプを見つけることができます。

OPはもともとDB2を指定していませんでした。したがって、私の答えは冗長です。

于 2010-07-19T02:22:04.787 に答える