0

何千ものINSERTステートメントを含むSQLファイルがいくつかあります。これらのスクリプトを実行する際の問題は、一部のスクリプトが一意の制約に違反していることです。

私はもともと次のようなことをしました:

BEGIN
    INSERT INTO .....;
    INSERT INTO .....;
    ...
EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN
       null;
END;
/
EXIT;

ただし、例外が発生した最初のインスタンスによってブロック全体が終了するように思われるため、残りのステートメントは実行されません。

私が使用しているOracleのバージョンは11ではないため、niceCONTINUEコマンドを使用できません。したがって、INSERTINTOステートメントごとに次のようなことを行うことを考えています。

BEGIN
    INSERT INTO ....;
EXCEPTION 
    WHEN DUP_VAL_ON_INDEX THEN
       null;
END;
/

...

sedを使用してSQLファイルの各行を読み取り、「INSERT INTO」という単語をスキャンし、存在する場合は、INSERT INTO行の間にBEGIN行とEXCEPTION行を追加するにはどうすればよいですか?その理由は、行が単なるコメントであり、それに追加したくない場合があるためです。

4

2 に答える 2

1

BEGIN行のブロックの前に追加しようとしているのINSERT INTOか、それとも単に各行の周りにBEGIN/行を追加したいのかは明確ではありません。後者の場合:EXCEPTIONINSERT INTO

sed '/^ *INSERT INTO/{ i\
BEGIN
a\
EXCEPTION
}' input-file
于 2012-09-17T17:22:37.190 に答える
0

この問題は複数の方法で修正できます。1つの方法は、挿入する前にレコードが重複していないことを検出することです。これはこのように行うことができます

select cout(*) INTO v_count

Fron table1 tb

where tb.column_name1 = val1;

IF v_count == 0 THEN
    insert into table1 values (val1, vale2....);
END IF;

ここでは、重複がない場合にのみ挿入しています。

別の方法は、プロシージャを作成して、挿入の代わりにプロシージャを呼び出すことです。これが疑似コードです

create procedure insert_row (val1 varchar2, val2 varchar2)
IS
BEGIN 

INSERT INTO ....; 

EXCEPTION  
    WHEN DUP_VAL_ON_INDEX THEN 
        null; 
END; 

このプロシージャは、プロシージャの呼び出しでレコードが重複しているために発生した例外を処理します。

ループを書くこともできます。それはあなたのデータとプログラムの論理に依存します。Pdedoコードは

Loop
    /* get the date from the cursor*/
    fetch cursor_c into record_r 

    EXIT WHEN  cursor%NOTFOUND;

    BEGIN 
        INSERT INTO .....; 
        EXCEPTION  
            WHEN DUP_VAL_ON_INDEX THEN 
                null; 
    END; 
END LOOP;

すべての挿入を取得するには、単純なgrep-iステートメントを使用します。これにより、ファイル内のすべての挿入が収集されます。PL/SQLまたはC/C ++ / Java言語プログラムを記述して、新しいSQLスクリプトを生成できます。

于 2012-09-18T20:52:07.690 に答える