2

null が検出されたときに値を代入する PL/SQL の NVL 関数があることを確認しました。
しかし、フィールドを NULL に設定したい場合はどうすればよいでしょうか。

EXEC SQL UPDATE mytable SET myfield=NULL WHERE otherValue=1;

HPUX で C++ を使用してこれを実行すると、NULL に 0L が使用されますが、Linux ではステートメントが で失敗しillegal valueます。

使用できる一般的な Oracle の null 値/メソッドはありますか?

4

5 に答える 5

4

ああ、今何が起こっているに違いないかを理解しています。C++ システム ヘッダーには#define NULL 0L(HPUX で) があるため、ハードコードされた NULL はプリプロセッサによってその値に置き換えられます。

いくつかのアイデア:

  • SQL ステートメントで NULL の大文字と小文字を変更するだけです。Oracle は大文字と小文字を区別しません。定義されたバージョンと正確に一致しない場合、置き換えられません。もちろん、NULL、Null、null などをすべて同じ値に定義している可能性があります。
  • そのコード行の周りで NULL の定義を無効にする方法を見つけてください。これを行う方法があると思いますが、プリプロセッサディレクティブについてはあまり知りません
  • リテラル NULL の代わりに空の文字列を使用してみてください。Oracle はこれを NULL に変換する必要があります。
  • ステートメントのテキストを構成ファイルに保存し、それを文字列に読み込みます。この方法では、実際にはコードに含まれないため、プリプロセッサはそれを変更しません。
  • 単純に NULL を返す関数を Oracle で記述し、NULL リテラルの代わりにその関数をステートメントで使用します。
于 2008-11-20T14:13:57.773 に答える
1

Oracle では NULL が正しい値です。私は C++ から Oracle を呼び出した経験がないので、問題の原因はわかりませんが、クライアント側の問題であるに違いありません。Oracle の SQLPlus を介してそのステートメントを実行する場合は、必要なことが行われるはずです。

于 2008-11-20T13:54:18.373 に答える
1

NULL はそのままで機能するはずですが、ここで説明されているようにインジケーター変数を試すことができます。

于 2008-11-20T14:13:14.480 に答える
0

はい - 問題は C++ での NULL の展開方法です。Informix には、変数を適切な値に設定する rsetnull があります。オラクルにこのようなものはありますか?

于 2008-11-20T14:03:32.737 に答える
0

EXECUTE SQL文を使用しているという事実は、CまたはC++プログラムでOracles Pro*Cを使用していることを示しています。

プリプロセッサが NULL に対して何らかの変換を行っている場合、コンパイル手順の一部が欠落しています。

コンパイルの前に、Pro*C プリプロセッサを介してソース コードを実行する必要があります。これは、EXEC SQL ステートメントを、c/c++ コンパイラがコンパイルできる一連の構造体と関数呼び出しに変換します。

このリンクは、いくつかの概念に役立つはずです。

于 2012-03-12T00:29:19.270 に答える