1

Oracle データベースに接続し、必要に応じて SQL クエリを実行する Pro*C コードがあります。次のような単純な SQL クエリ:

SELECT A, B FROM TBL1 WHERE A = 'a'

ORA-01405: fetched column value is NULL A は VARCHAR2(30) として定義され、B は NUMBER(4,2) として定義されます。 私の Pro*c バージョンは Pro*C/C++: Release 11.2.0.3.0 、GNU gcc ファミリのコンパイラ g++ バージョン 2.95.3 を使用しています。Oracle のドキュメント ( http://docs.oracle.com/cd/A57673_01/DOC/api/doc/PC_22/ch03a.htm ) には、次のように記載されています。

if you SELECT or FETCH a null into a host variable that has no indicator, Oracle issues the following error message:

ORA-01405: fetched column value is NULL

Pro*c の実行中に UNSAFE_NULL=YES を指定して ORA-01405 メッセージを無効にすることができますが、proc コマンドでそのフラグを追加しようとすると、MODE=ORACLE および DBMS=V7 またはV8

他の提案はありますか?

4

2 に答える 2

2

Pro*C を使用してから何年も経ちますが、以前のバージョンの Pro*C で初めてこの問題に遭遇したときのことを覚えています。値が NULL かどうかを確認するために標識変数を使用する必要がありました。しかし、Oracle が STRING データ型を導入したとき、それは変わりました。私はこれがとても気に入ったので、TO_CHAR の数字を STRING に保存することさえ始めました。

リンク先のドキュメントからこれを参照してください。

ストリング

STRING データ型は VARCHAR2 データ型と似ていますが、STRING 値は常に NULL で終了します。

入力時 Oracle は指定された長さを使用して、ヌル ターミネータのスキャンを制限します。null ターミネータが見つからない場合、Oracle はエラーを生成します。長さを指定しない場合、Oracle は最大長を 2000 バイトと見なします。STRING 値の最小長は 2 バイトです。最初の文字が NULL 終止符で、指定された長さが 2 の場合、列が NOT NULL として定義されていない限り、Oracle は NULL を挿入します。列が NOT NULL として定義されている場合、エラーが発生します。すべて空白の値はそのまま格納されます。

出力時 Oracle は、返された最後の文字に NULL バイトを追加します。文字列の長さが指定された長さを超える場合、Oracle は出力値を切り捨て、NULL バイトを追加します。null が SELECT された場合、Oracle は最初の文字位置に null バイトを返します。

于 2014-08-29T22:49:54.843 に答える
0

null 検出にインジケーターを使用する:

短いidxA、idxB;

FETCH ... INTO :varA :idxA, :varB :idxB;

次に、値が NULL の場合、indicator は -1 に設定されます。

于 2014-10-27T08:21:25.703 に答える