4

一時テーブルからターゲット テーブルに一連のレコードをコピーしたいと考えています。問題は、一部のレコードがターゲット テーブルのチェック制約に違反する可能性があることです。そのため、可能なすべてのものを挿入し、無効なレコードのエラー ログを別の場所に生成したいと考えています。

私が実行した場合:

INSERT INTO target_table
  SELECT ... FROM temp_table

いずれかのレコードが制約に違反している場合、何も挿入されません。ループを作って手動で1つずつ挿入することもできましたが、パフォーマンスが低下すると思います。

4

2 に答える 2

7

WHEN ANY DOレコードをコピーし、ステートメントでエラーをキャッチするストアドプロシージャを作成できます。

CREATE PROCEDURE CopyRecords( ... )
AS
BEGIN
  FOR select ... FROM temp_table INTO ... DO BEGIN
     INSERT INTO target_table ...
     WHEN ANY DO BEGIN
        INSERT INTO ErrorLog(SQL_Code, GDS_Code, ... ) VALUES(SQLCODE, GDSCODE, ...);
     END
  END
END

このWHEN ... DOステートメントは、InterBase 6.0言語リファレンス(ページを下にスクロールすると、IB 6ドキュメントのダウンロードが下部にあります)の「手順とトリガー」の章に記載されています。

GDSCODEおよびコンテキスト変数は、エラーの正確な理由を分析するのSQLCODEに役立ちます。

于 2013-02-15T13:20:25.243 に答える
1

このような:

INSERT INTO
    some_table1 (fld1, fld2, fld3)
SELECT
    some_table2.fld1,
    some_table2.fld2,
    some_table2.fld3
FROM
    some_table2
WHERE
    some_table2.fld > 100
LIMIT
    5;
于 2013-02-15T12:31:13.883 に答える