ORA-01002: フェッチ順序が無効です。
必要なデータをユーザーに返します。
この動作を「フェッチ」と呼びます。
らしいです。
ま、わかる人にはわかるんでしょうねぇ…

で?フェッチの順序が無効って…なんなわけ??
【ケース】
いつものごとくseasar2を使って、ツールを作っていたらでたSQLえらー・・・・
「ORA-01002: フェッチ順序が無効です。 」
やってる作業は…
レコードロック
↓
update or insert
を、ただ繰り返すだけの処理。
で、何でこれがおこるの??
しかも、おこったり、おこらなかったり…
さっぱりだ。
【結論】
なんかね…
トランザクション制御がうまくいってないらしいよ。
ほんとかどうか知らんけど(= 3 =)y-~
またあとで~。
オラクルのエラーはここ。
EmptyRuntimeException
: [ESSR0007]requestはnullあるいは空であってはいけません
request ってなに??
この例外が起きたのは、Servlet とか使わないツール…
あれ?
requestってなに?? 何のこと言ってるの??
つか、誰からのリクエスト?????
【今回のケース】
〇前提条件
batファイルから起動するアプリ作成。
もともと既存である大きいツールの機能を借りてプログラムを実行します。
んで、大きいプログラム自体が、S2とStrutsを使用してる。
要するに、webからのリクエストもらってるんです。
で・も。
今回はbatからのmainメソッド機動で始まるツール。
リクエストなんか、どこからも飛んできませんす。
〇本題
// 読み込み
S2ContainerFactory.create("app.dicon")
// インスタンスの初期化
SingletonS2ContainerFactory.init();
// コンテナの取得
S2Container container = SingletonS2ContainerFactory.getContainer();
// 登録されたオブジェクトを取得する。
Main object = (MyComponent) container. getComponent(Main.class);
// mainメソッドの実行
object.main();
デバッグしても、この時点ではおきません。
さぁ、どこで起きたかというと、
大きいプログラムの奥の方のメソッド(インスタンス生成を行うよ)
でおきてたんだよ…orz
いったい…
何が原因??
【結果】
daiconでした…orz
instance="request"
エラーをぶっ放していたクラス(呼び出しメソッドでインスタンス生成しようとしてたクラスね?)
の大根定義にに、しっかり書いてありました。
インスタンス属性のrequestとは、
「リクエスト毎に1つのインスタンスが作成されます。name属性に指定した名前で、コンポーネントがリクエストに格納されます。」
だそうで…
そりゃ、リクエストがないのにこんなん呼び出そうとしてたらエラーこくわ…orz
【実施】
ので、結局大きいプログラムのdiconは呼ばないようにした~
んで、大きいプログラムのインスタンス定義も独自のdiconファイルに
記載したんです。
ま、要するに、instance="request" を消しただけなんだけどね…
でも、なんか、小手先な気がするなぁ…
インスタンス属性
継承される親クラスのインスタンスが作成されない
朝、何でか疑問だた事が…
とけたのか…
とけてないのか…
とりあえずっ
わかたことは これっ!!
abstractクラス(抽象クラス) は、dicon ファイルに記載しても、
インスタンス自体が生成されないため、意味がない…
どころか、どうしてかわからないけども、
abstractクラス自体の単体テスト等を行おうとすると、
includeでdiconファイルを読み込むとき、
例のTOOMany~例外がっぺっぺされる。
【ケース】
今回のケースは、
どうしても抽象クラス独自のロジッククラスを生成しなければならず、
diconに定義できなければ、必要なインスタンスを生成できない。
※通常のクラスではなく、Daoクラス等のインターフェースならば、
継承した子クラスの生成時に読み込まれるため特に問題はない。
…みたい。
【実施】
1.親クラスのDIのためのフィールドのアクセスレベルを private から
protected に変更
2.子クラスに、1で用意した親クラスのフィールドのためのセッターを作成する
3.2で準備したセッターに@dicon~を定義
4.ビルドでdiconを自動生成
…こんなで一応動いたけども…
いいわけない気がするなぁ…
というわけで、
to be Continue…