プロが教える店舗&オフィスのセキュリティ対策術

動的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)

A 回答 (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変数の中に設定されています。

補足日時:2006/01/23 19:29
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!