テーブルの一部を同じサーバー上の別のデータベースにアーカイブしようとしています。ただし、INSERT INTO...SELECT...FROM はビルド時にエラー (SQLSTATE=42704) を返します。テーブルは 2 番目のデータベースに存在します。誰でもこれを手伝ってもらえますか?
6 に答える
私たちはそれをクラックしました!次のスクリプトを使用すると、機能します。LOADは、コピーされた行のバッチ間でCOMMITする必要なしに機能します。(「トランザクションログがいっぱいです...」エラーの問題も解決されました)
LS2DB001に接続します。IXFメッセージ「C:\ temp \TIN_TRIGGER_OUT.EXM」の「C:\ temp\TIN_TRIGGER_OUT.IXF」へのエクスポートSELECT*FROM LS2USER.TIN_TRIGGER_OUT; コネクトリセット; LQIFCOLDに接続します。IXFメッセージ"C:\ temp \TIN_TRIGGER_OUT.IMM"の"C:\ temp\TIN_TRIGGER_OUT.IXF"からロードLS2USER.TIN_TRIGGER_OUTに挿入します。専念; コネクトリセット;
あなたの質問からは、使用されている DB2 のバージョンが明確ではありません。Linux、Unix、および Windows バージョンだと思います。フェデレーションを使用して 2 つのデータベースをリンクしているようです。
クエリの SELECT 部分は LS2DB001 から機能しますか? どのデータベースに問題があるかを特定する価値があります。
問題が LS2DB001 にあると仮定して、フェデレーテッド・リンクを定義したユーザーが照会のベース・テーブルに対する権限を持っている場合は、システム・カタログ・テーブルに対する権限も持っていることを確認してください。そうでない場合、クエリを実行できることを解析および検証できません。
これを行う最良の方法は、カスタムスクリプトを作成することです。テーブルのサイズ(レコード数)に応じて、すべてのデータをメモリに選択してロールオーバーし、最初に作成したテーブルのコピーに挿入するか、データを次のようにエクスポートすることができます。 csvファイルまたはその他のテキストベースのファイルをロールオーバーして、データを他のテーブルに挿入します。
これを実行できるような正式なバックアップ手順がまだない場合は、これが最善の策です。
注:iSeries上のデータベースなど、一部のdb2データベースには実際には「データベース」がなく、ライブラリーがあります。適切なユーザープロファイルを使用すると、2つのライブラリに同時にアクセスして、それらのテーブルを結合したり、
create table library/newFilename as
(select * from originallibrary/originalfilename) with data
しかし、これは私が信じているiSeriesにのみ当てはまります。
できるよ
Select 'insert into tblxxxx (blabla,blabal) values(' + fld1 + ',' + fld2 + ',' ...... + ')'
From tblxxxxxx
結果をテキストスクリプトとしてコピーし、他のDBで実行します。
この回答を別の回答として書いているので、より多くのスペースがあります。
手順をコンポーネントに分解し、エラーが発生している場所を確認することをお勧めします。繰り返しますが、フェデレーションを使用していると仮定しています。
a) FROM データベースで、フェデレーテッド リンクに使用しているユーザーとして接続している場合、選択は機能しますか?
b) TO データベースで、リンクを使用して、選択は機能しますか?
c) TO データベースで、ストアド プロシージャ経由のリンクを使用して、選択は機能しますか?
d) TO データベースで、INSERT...values(x,y,z) を使用して、テーブルに挿入できますか?
e) INSERT...values(x,y,z) を使用してストアド プロシージャ経由で TO データベースに挿入できますか?
これ以上の情報がなければ、これが私が提案できる最善の攻撃方法です。