8

私は、Oracle PL/SQL で記述されたレガシー システムと統合する Java アプリケーションに取り組んでいます。残念ながら、このレガシー システムを変更することはできません。このシステムの問題点は、COMMIT ステートメントがプロシージャーに書き込まれることがあるということです。しかし、これにより、アプリケーション レベルでトランザクションを正しく処理できなくなります。

コミットステートメントを無視するようにOracleデータベースプロシージャを作成することは可能ですか?

ALTER SESSION DISABLE COMMIT IN PROCEDUREPL/SQLプロシージャがコミットしようとしているときに、接続の開始時に実行すると例外が発生することがわかりました 。しかし、PL/SQLコードを変更せずにOracleにコミットを無視させることは可能ですか?

4

6 に答える 6

6

私はあなたがそれを行うことができるとは思わない. これらのプロシージャには、デフォルト値が true の「do commit」などのパラメーターを追加する必要があります。そして、パラメーターを false に設定して呼び出します。ネストされている場合は、パラメーター値を渡します。そうすれば、レガシー コードは同じように動作しますが、トランザクション制御を取得できます。

于 2013-06-22T04:05:16.710 に答える
2

おそらく最善の方法は、現在の機能に影響を与えずに pl/sql プロシージャを変更することです。つまり、新しいパラメータを追加して、ユーザーがコミットを無視できるようにしますが、既存の機能 (コミット) をデフォルトにします。私は同様の状況でこれを行いましたが、うまくいきました。

したがって、次のようになります。

create or replace procedure some_proc(
    i_num in number, -- existing parameter
    i_commit in number default 1) -- perform commit? 0=false, else true
as

begin
  -- some DML here

  if (i_commit <> 0) then
    commit;
  end if;

end;

この新しいパラメータがパラメータ リストの最後に追加されていることを確認してください。したがって、アプリは i_commit に対して 0 (false) を渡します。

それが役立つことを願っています。

于 2013-06-28T14:55:15.143 に答える
0

私は、Oracle PL/SQL で記述されたレガシー システムと統合する Java アプリケーションに取り組んでいます。残念ながら、このレガシー システムを変更することはできません。

うーん、これは政治の匂いがする.. 私は推測する。:(

実際のところ、COMMIT@Tilman Fliegel (およびその他) が既に述べたように、ステートメントを無視することはおそらく不可能です。もしそうなら、それはあなたのコードベースの非常に醜い疣贅になるでしょう.

私は政治が得意ではありませんが、これを使用または変更できない場合は、これを使用しないでください。つまり:

  • 手順が他の (古い、不変の) システムで使用されているために変更できない場合は、それらを複製し、満足するまでコピーを変更/リファクタリングします。バージョンをレトロ互換にすることができれば、他の (古い) システムが後でリファクタリングされた場合に、あなたのシステムを使用する方法を提供することさえできます: 「レガシーモード」入力パラメーターなどを導入するだけです。 . 他の答え。
  • コードを理解/テストできないためにコードを変更できない場合、これは大きな問題です。ゴミ箱に捨てて、最初からやり直す方が安全かもしれません (そうできる場合)。

COMMITしかし、結局のところ、 s を無視しようとする方が簡単かもしれません。人間はリファクタリングがとても難しいです... ;)

于 2013-07-01T13:30:26.217 に答える
0

手順が何をしたかを知ることは役に立ちました。ただし、プロシージャが限られた数のテーブルのデータを変更すると仮定すると (これは PLSQL で主に行うことです)、そのスキーマでフラッシュバック クエリを実行してみることができます。

FLASHBACK TABLE TABLE_NAME TO TIMESTAMP(TO_DATE('06-SEP-2012 23:59:59','DD-MON-YYYY HH24: MI: SS'));

時間文字列 "06-SEP-2012 23:59:59" を Java コードでプロシージャが呼び出される直前の時間に設定できます。

悪い回避策ですが、試してみる価値があると思います

于 2013-06-30T18:57:16.183 に答える
0

ALTER SESSION DISABLE COMMIT IN PROCEDURE PL/SQLプロシージャがコミットしようとしているときに、接続の開始時に実行すると例外が発生することがわかりました。

ええ、そのステートメントの文書化された動作は、プロシージャがコミットを発行しようとした場合に ORA-00034 例外を強制することです。コミットが埋め込まれたプロシージャを識別するために、テスト用として意図されていると思います。

ストアド プロシージャがコミットを発行することは、悪い習慣だと広く見なされていると思います。トランザクションの制御は、呼び出しスタックの最上位に属している必要があります。

残念ながら、これらの埋め込まれたコミットを無視する方法はありません。PL/SQLルーチンを書き直すか、コール・コードにいくつかの回避策をコーディングする必要があります(コミットされた変更を元に戻すために追加のDMLを発行する例外ハンドラなど)。

于 2013-06-26T10:27:14.807 に答える