- 締切済み
動的SQLでのDECODE
動的SQLでのDECODEがうまくいかず困っています。 SELECT DECODE(A.ROWID,NULL,'0','1') FROM A WHERE A.CODE = 9999 の様な感じのSQLを発行しているのですが、 戻ってくるI変数は1、V変数の中身はNULLとなっています。 どなたか対処法をご存じの方がいらっしゃいましたら教えてください。 よろしくお願いします。 ちなみに、DECODE指定しないとROWIDはちゃんと取得できますので、 対処方法はあると言えばあるのですが。。。 動作環境 OS :Red Hat Enterprise Linux AS release 3 Oracle:10g (10.1.0.2.0)
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- k_o_r_o_c_h_a_n
- ベストアンサー率55% (526/942)
回答No.1
そもそも、I変数やV変数に関する説明がないところで それらについて質問されても、何も回答することができません。 DECODE式は、静的なSQLであっても、動的なSQLであっても 同様に”正しく”動作します。 ちなみに、書かれたSQLでROWIDをDECODEしていますが、 ROWID擬似列が、NULLとなることはないので、固定1を 求めるDECODE式になっていませんか? DECODE式をは別に、ROWIDが必要なら・・ select decode(なんたら),rowid rid from a where なんたら; のように、ROWIDを明記すれば良いと思いますよ。
補足
SQLの例が悪くてすいません。 実際は複数のテーブルを右結合等でリレーションしています。 ですので、テーブルAに該当するレコードが無かった場合には、ROWIDはNULLになると思います。 SELECT A.NAME, A.ADDR, DECODE(A.ROWID,NULL,'0','1') FROM A, B WHERE A.CODE(+) = B.CODE AND A.ID(+) = B.ID AND B.CODE = '999' 実際、できあがったSQLをSQL*Plus等で実行すると、DECODEが行われます。 ex) Bには、CODE=999、ID=001、002があり、 Aには、CODE=999、ID=001しかなかった場合、 NAME ADDR DECODE ---- ---- ------ name addr '1' - - '0' ; -は実際はNULL I変数、V変数はSQLDA構造体の項目です。 動的SQL発行前に領域確保し、ここへ情報が返却され、 プログラマーズガイドには以下の様な説明がなされています。 struct SQLDA { long N; /* Descriptor size in number of entries */ char **V; /* Ptr to Arr of addresses of main variables */ long *L; /* Ptr to Arr of lengths of buffers */ short *T; /* Ptr to Arr of types of buffers */ short **I; /* Ptr to Arr of addresses of indicator vars */ long F; /* Number of variables found by DESCRIBE */ char **S; /* Ptr to Arr of variable name pointers */ short *M; /* Ptr to Arr of max lengths of var. names */ short *C; /* Ptr to Arr of current lengths of var. names */ char **X; /* Ptr to Arr of ind. var. name pointers */ short *Y; /* Ptr to Arr of max lengths of ind. var. names */ short *Z; /* Ptr to Arr of cur lengths of ind. var. names */ }; ・I変数は、インジケータ変数を格納するデータ・バッファのアドレスの配列へのポインタです。 インジケータ変数の値が-1 のとき、関連するバインド変数の値はNULL です。 ・V変数は、選択リストまたはバインド変数の値を格納するデータ・バッファのアドレスからなる 配列のポインタです。 ですので、I変数に-1が返却されれば値を取っていないと言うことですが、1が返却されていますので、 何かしらの値を取得していると思われるのですが、中身がNULLと言う結果になっています。 DECODE指定を行わないと 'AAA....'の文字列がV変数の中に設定されています。