• ベストアンサー

PL/SQL temporary tableってもてるの??

1.procedureが呼ばれて、複数のtableがupdateされます 2.条件判定によってrollbackされる ここで、1で複数tableに書き込まれたものが戻ってしまう。 1つだけrollbackしたくないtableがあるので、rollback前の対象レコードを保持しておいて、rollback後、保持しておいた値で再度updateして欲しいという依頼なのです。 rollback前の対象レコード(複数存在します)をワークエリアに保持しておいて、rollback後、その値をとってupdateすればいいのでは? と考えたのですが。 temporary tableに持てるのかなぁ?と。 PLは初体験なので、書き方もよくわからりません。どなたかご教授願えませんか?また、なにか他にいい方法がありましたらアドバイスください。よろしくお願いします。

  • Oracle
  • 回答数2
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • jmh
  • ベストアンサー率23% (71/304)
回答No.2

delete t where … returning … bulk collect into … で削除しながら回収して、rollback の後 insert するとイイんじゃないかしら。

その他の回答 (1)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ > 1つだけrollbackしたくないtableがあるので、・・・ rollback したくないテーブルに対する更新部分を自律型トランザクション としてStored Procedure にして下さい。 自律型トランザクションの中でCommit すれば、後は呼出元が Rollback されてもデータは確定されます。 詳細については、マニュアルで確認して下さい。

satosai
質問者

補足

アドバイスありがとうございます。複数のtableを更新しているprocedureは別チームが管理しているため、そちらのprocedureには手出しができないのです。いろいろ深い事情があるらしく・・・。

関連するQ&A

  • PL/SQLの戻り値について

    現在正規化されていないテーブルを、PL/SQLを使って集計したいと考えています。以下のような構造にしたいと思うのですが、可能でしょうか? 1.正規化されていないテーブルのデータを正規化されたテーブル(テンポラリーテーブル)へ転記 2.テンポラリーテーブルテーブルのデータを集計(GROUP BYなどで) 3.2の結果を戻す 上記1~3までをすべてPL/SQLで実行し、その結果を取得したいです。 なお取得する結果としては、  キー,集計値1,集計値2    ・    ・    ・ というような構造で、複数レコードあります。 つまり、通常のSELECT文で返ってくる値を、PL/SQLで戻したいと考えています。

  • PL/SQLについて

    お世話になります。今回初めてPL/SQLに触れているのですが…一度のプロシージャの呼び出しでSELECTを二度行う事は可能なんでしょうか? 一度UPDATEしたのちに同じテーブルの違う値を更新するという作業を行いたくそのためには更新した後もう一度SELECTを行いたいのです。時間の許す限り調べはしたのですが…余裕がなくなってしまったのでここで質問させて頂くことにしました。どなたかご指導よろしくお願い致します。

  • PL/SQL 条件アップデートについて

    PL/SQLを使用して、条件に合致するレコードのみをアップデートしようとした場合 この条件が他のテーブルを参照しなければいけない時どのようなロジックで実現できるでしょうか? 例えば下記のようなアップデート対象テーブルがあります。 トランT 取引先| 年月 |店舗区分1 |売上  AAA   201105     1     10000 マスタT 取引先| 開始日 | 終了日  AAA   20100501  20110608 トランTは月別店舗別の売上を管理しているテーブルで マスタTは店舗の休業日数を管理いているマスタテーブルになります。 更新を行いたいのはトランTのフィールド「店舗区分1」でその条件は 前年同月に休業日が発生している店舗の「店舗区分1」を'2'に変更したい場合どのようにすれば これを実現できるでしょうか? やり方は複数あると思うのですがPL/SQLで実現できればと思っています。 しかし、PL/SQL初心者の為これに必要なコマンドや関数などがわかりません。 調べてみてもこのようなケースのサンプルなどが無く困っています。 どなたか詳しい方がいればご教示頂きたく存じます。 よろしくお願いします。

  • PL/SQLでフェッチでNULLの項目について

    PL/SQLで質問があります。 たとえば複数レコードがあり、フェッチで1件ずつ処理する場合、 1件目で値あり、2件目NULLの場合、2件目のフェッチでINTOした変数はNULLが保証されるでしょうか? それとも1件目の値が残ってしまうでしょうか? サンプルでフェッチのループ内で変数の初期化をしない場合でも、NULLで上書きされているようにみえますが、PL/SQLではありませんが以前ProCでNULLの場合は前のレコードの値が残ってしまったため、PL/SQLは上書きが保証されるのかが気になっています(どちらもオラクルなので似た仕様になるのではと懸念)。 グーグル先生に聞いてみましたが、明記されているサイトがみつからず・・・。 ProCはインディケータでNULLを判定するので値の変数にはNULLの場合、何もしないだけでPL/SQLでは特に初期化を気にすることはないのかもしれませんが、仕様として記述されている箇所が見つからないためご存知の方がいらっしゃいましたら教えて頂けると助かります。 具体的には仕事でそういうコーディングになっている箇所があり、直すべきかそのままで問題ないかを検討しています。 現段階ではあまり修正できる状況ではないため、問題にならなければそのままとしたいと考えています。 サンプルの実行結果上は問題なさそうなのですが、できればプラスアルファの情報が欲しく。

  • SQLの処理結果について

    お世話になります。 毎回気になっていることがあります。 MySQLでアップデートやインサートを含む一連の処理が正常に行われたかを確認する方法として現在クエリー実行結果がTrueかFalseで判定をしているのですが、これは正しい方法なのでしょうか? 例えばUPDATEをしたあとにphp内で別の処理をする場合、これらのすべての処理が完了したかを確認するし、途中で中断していたらその前の処理も行わない(取り消す)ということは可能なのでしょうか? 例: 1、テーブルからAという値をセレクト 2、A+1 3、テーブルAにアップデート 4、A+1 5、テーブルBに4の値を書き込み 3の処理が失敗している場合、5の処理は行わないというようのしたいのです。 毎回If分岐というのがよいのでしょうか? 複数回判定が必要な場合などぼ方法を教えていただけると幸いです。

    • ベストアンサー
    • PHP
  • PL/SQLで変数へ値の代入

    PROCEDURE TEST(PI_ABC IN A_TABLE.A_CODE%TYPE) IS CURSOR CUR IS SELECT A_CODE FROM A_TABLE; BEGIN --抽出したデータを代入 FOR REC_CUR IN CUR LOOP PI_ABC := REC_CUR.A_CODE; END LOOP; 上記のコードを実行すると ORA-06502:数値または値のエラー PL/SQL: 文字列バッファが小さすぎます。 とエラーが出ます。 このプロシージャを呼び出す時にも同じテーブル同じ項目を渡しています。 同パッケージ内で同じ事をやっているのに特定のプロシージャだけ 上記のエラーが出てしまいます。 環境:Windows2003Server oracle9i

  • T-SQLで

    SQL Server2005でストアドプロシージャを作ろうと思うのですが、カーソルにパラメータを実装できないそうで困っています。 やりたいことは、 「ワークテーブルからSELECTして、別のテーブルにINSERT or UPDATEする」 です。 ワークテーブルからSELECTするところをカーソルにするのですが、SELECT条件は可変なので、その部分をパラメータでカーソルに渡したいのです。 Oracleならできたんですが・・・。 どうすれば実現できますか?

  • oracle10g update件数の取得方法

    oracle10g update件数の取得方法 pl sql(stored procedure)で複数のupdate文を適用します。update後にupdateしたレコード件数をログテーブルにinsertしたいのですが、updateしたレコード件数を取得する方法はありますか?

  • updateについて(SQL)

    こんばんわ。現在、oracle8i,SQLを勉強中で基本的な事はできるようになったのですが、わからない所が出てきたのでよろしくお願いします。 売上票 年月日 当日売上 前日売上 ------------------------ 2000/04/11 100 2000/04/10 150 2000/04/09 90 2000/04/08 120 このようなテーブルがある時に前日売上に一つ前のレコードの当日売上の値を更新したいのですが、そのような事をSQL文(1文)で実現することはできるのでしょうか?updateするときに一つ前のレコードの値を取得することは出来るのでしょうか?いろいろとサイトを回って探してみたのですが、該当レコードの値を操作するものはみつかったのですが、他のレコードを操作するものは見つかりませんでした。 よろしくお願いします。見当違いな質問でしたらお許し下さい。

  • [PL/SQL]REFCURSORが戻り値のプロシージャについて

    [PL/SQL]REFCURSORが戻り値のプロシージャについて お世話になってます タイトルの内容について、親プロシージャより引数を受け取り 子プロシージャでカーソルをオープンして、そのカーソルを親に戻す。 というプロシージャなのですが、親から実行した場合には問題ないのですが 子をSI ObjectBrowserから実行すると[実行][デバッグ]共に 押した瞬間に止まってしまいます。 下記にソースを記述します --カーソル変数の定義 CREATE OR REPLACE PACKAGE LC7BDEV.PKG_TEST_CURSOR IS  TYPE TEST_TYPE IS RECORD  (COL1 TABLE1.COL1%TYPE ,   COL2 TABLE1.COL2%TYPE ); TYPE CUR_TEST IS REF CURSOR RETURN TEST_TYPE; END; --親プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST  (   in_COL_KEY IN TABLE1.COL_KEY%TYPE  ) IS  TEST_REC  PKG_TEST_CURSOR.CUR_TEST;  TEMP_COL1 TABLE1.COL1%TYPE;  TEMP_COL2  TABLE1.COL1%TYPE; BEGIN  PD_TEST_KO(in_COL_KEY,TEST_REC);  loop   fetch TEST_REC into TEMP_COL1,TEMP_COL2;   exit when TEST_REC%notfound;   dbms_output.put_line(TEMP_COL1 || ',' || TEMP_COL2);  end loop;    close TEST_REC; END; --子プロシージャ CREATE OR REPLACE PROCEDURE PD_TEST_KO  (   in_COL_KEY  IN  TABLE1.COL_KEY%TYPE ,   in_TEST_REC OUT PKG_TEST_CURSOR.CUR_TEST ,  ) IS BEGIN  OPEN in_TEST_REC FOR   SELECT COL1,COL2   FROM TABLE1   WHERE COL_KEY = in_COL_KEY END;