2011-12-04 9 views
2

複数のsqlファイルがあります。私はそれらをトランザクションで実行する必要があります。エラーが発生すると、すべての変更がロールバックされます。Oracle - トランザクションで複数のsqlファイルを実行

これはsqlplusまたは他のツールを使用して可能ですか?

EDITこれらのファイルには明示的なコミットはありません。DDL SQLだけです。

+0

暗黙のコミット(データ定義文など)がない場合、すべてのソースファイルをより大きなものに連結します。 – artistoex

+1

あなたは詳細を提供していませんが、一般的に:これが可能かどうかは、SQLファイルの内容に大きく依存します(例えば、明示的な 'COMMIT'がある、ストアドプロシージャは関係していますか?すべてのDBリンクは関係していますか?など)...あなたがわからない/ SQLファイルの内容を制御できない場合は、私はいいえと言います... – Yahia

+0

EDITのおかげで...下の私の答えを見てください.. 。 – Yahia

答えて

3

は、一般的に:これは非常にSQLファイルの内容に依存して可能であるかどうか - 例えば:

  • は、明示的なCOMMITのがありますか?
  • は、関係するストアドプロシージャですか?
  • DDLコマンドはありますか?
  • はすべてのDBリンクですか?

など

あなたはファイルが含まれていないことを確認することができます場合は、.. /私はノーと言うだろうSQLファイルの内容を管理している

がわからない場合OPを追加した後に - 任意のCOMMIT、任意のDDL、任意のストアドプロシージャは

UPDATE ...まさにあなたのツールに依存していることを行う方法... THENあなただけそれらを連結して1つのトランザクションでそれらを実行できるなどを呼び出しますSQLファイルにDDLコマンドが含まれていること:

DDLコマンドでは暗黙的にCOMMITが使用されているため、答えはNOです。一部のデータベースではいくつかの「回避策」が考えられます(たとえば、Oracleは構成可能な「フラッシュバック領域」を持っています。しかし、ほとんどはそうしない。

これを解決する通常の方法(DDLスクリプト/トランザクション)は、2つのスクリプトを作成することです.1つはすべての変更を行い、もう1つは最初のスクリプトの実行中にエラーが発生した場合のみ実行します。そのようなスクリプトを書くことは、あなたの状況の詳細に依存します。

1

startコマンドを使用すると、whenever sqlerrorはコミットしません。

+0

SQLファイルに 'COMMIT'自身やDDLコマンドが含まれていたり、DBリンクやストアドプロシージャなどを使用していると、確実に動作しません。 – Yahia

+0

私は暗黙のコミットも意味しました。簡単な質問を簡単なものにしないでください!! –

1

Oracleでは、CREATE ...、ALTER ...またはDROP ...などのすべてのDDL(データ定義言語)コマンドは、文の前後に暗黙的にコミットします。したがって、あなたのSQLファイルにはそのようなステートメントが含まれているので、それらのステートメントのための単一のトランザクションを持つことはできません。

これは、複数のファイルを使用する場合の制限ではありません。これは、すべてのOracle DDL文の制限です。

+0

あなたは正しいです! 1つの追加:Oracleの場合は、フラッシュバック領域を悪用して、特定の時点まですべてのものをロールバックすることができます(推奨されていません)。 – Yahia

関連する問題