- - PR -
動的SQL使用時にCOMMITすると次のフェッチでエラー
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-11-28 13:43
対象テーブルが不定(引数でもらう)なので動的SQL文を作成してフェッチを行い、
項目に対してチェックを行って、エラーとなる場合にはそのテーブルの 区分にエラー値を設定したいのですが、COMMITを発行した後、次のフェッチを行うと ORA-01002: フェッチ順序が無効です。 が発生します。処理の都合上、1レコード毎にCOMMITしたいのですが、 動的SQLを使用する場合は無理なのでしょうか。別の方法があれば教えて下さい。
宜しくお願いします。 | ||||||||||||
|
投稿日時: 2005-11-28 16:23
動的SQLでなく、静的な埋め込みSQLでも
同じエラーメッセージが出力されます。 1件ずつCommitしたいとのことですが、 SELECT文でFOR UPDATEをつけているので すべての処理が終わるまでCOMMITしないほうがいいんじゃないでしょうか? FOR UPDATEのロックが外れてもいいのであれば、BULK FETCHという方法で 1件Commitは出来るようになるのですが・・・・。
#カーソルクローズ忘れたので追記 [ メッセージ編集済み 編集者: 夏椰【SUICA】 編集日時 2005-11-28 16:32 ] | ||||||||||||
|
投稿日時: 2005-11-28 17:17
FOR UPDATEが問題の様です。
1件ずつCOMMITする必要がある場合はFOR UPDATEを付けてはならない様ですね。 せっかく教えて頂いたBULKですが、テーブル名が不定なためTABLE OFでの定義は 難しいようです。 業務的にロックの必要性の有無をもう一度検討したいと思います。 有難う御座いました。 | ||||||||||||
|
投稿日時: 2005-11-28 19:38
あ〜と、ごめんなさい。例が悪かったようで。
の「TEST.TEST1.COL1%TYPE」は列の型を指定しているのです。 なのでTEST.TEST1.COL1がVARCHAR(100)だったとしたら
と書いても同じ動作となります。 よって、更新する列の型がわかっているのであれば、 その型を書いていただければいいかと。 以上、補足でした(^^; | ||||||||||||
|
投稿日時: 2005-11-29 10:38
実は取得する項目名、項目数も別情報(別テーブルで指定)なのです。
よって、実行時にならないとどの型の変数がいくつ必要になるか判らないのです。 NUMBER型の索引付き表w_REC_NUMやCHAR型の索引付き表w_REC_CHR等を作って 何とか取り出そうとしているのです。なので教えて頂いたcol1の為の変数や TABLE OF VARCHAR(100);という指定は難しいのです。 今回は表全体をロックする必要はなかった様なのでFOR UPDATEを除くだけで良くなりそうです。 何度も有難う御座いました。 | ||||||||||||
1
