-2

Oracle 8i バージョンで機能する、以下に示す INSERT ALL ステートメントの最良かつ最も推奨される代替手段は何ですか? 非常に残念なことに、この特定のステートメントが 8i ではその単純さと読みやすさで機能していません。いくつかの入力を提供できれば素晴らしいでしょう。ありがとうございました。

INSERT ALL ステートメント

INSERT ALL
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
  INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n)
SELECT * FROM dual;

また、何らかの理由で、推奨事項の 1 つが以下に示すクエリと一致しない場合は、より良い結果が得られます。

insert into pager (PAG_ID,PAG_PARENT,PAG_NAME,PAG_ACTIVE)
      select 8000,0,'Multi 8000',1 from dual
union all select 8001,0,'Multi 8001',1 from dual

どうもありがとうございました!

4

1 に答える 1

2

これらの行を 1 つのトランザクションとして挿入する場合は、次のようにします。

BEGIN 
  SAVEPOINT some_name;
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
  INSERT INTO mytable (column1, column2, column_n) VALUES (expr1, expr2, expr_n);
EXCEPTION WHEN OTHERS THEN 
     ROLLBACK TO some_name;
     RAISE; -- reraise current error
END;
/

これは、単一のコマンドの動作をシミュレートするINSERT ALL
INSERT ALLため、何らかのエラーが発生すると、このトランザクションによって行われたすべての変更がロールバックされます (ステートメント レベルの原子性については、http : //docs.oracle.com/cd/E25054_01/server を参照してください) 。 1111/e25789/transact.htm )

于 2015-12-20T12:09:52.107 に答える