PL / SQL - 设置空值

时间:2008-11-20 13:49:11

标签: c++ sql oracle p

我已经看到PL / SQL有一个NVL函数,当遇到null时会替换一个值 但是,如果我想将字段设置为NULL,例如

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

当我在HPUX上使用C ++运行时,0L用于null,而在Linux上,语句以illegal value失败。

我可以使用通用的Oracle null值/方法吗?

感谢。

5 个答案:

答案 0 :(得分:4)

哦,现在我意识到必须发生的事情。 C ++系统头文件有#define NULL 0L(在HPUX中),因此预处理器将硬编码的NULL替换为该值。

几个想法:

  • 只需在SQL语句中更改NULL的大小写。 Oracle并不关心这种情况,如果它与定义的版本不匹配,它将不会被替换。当然,他们可能已经将NULL,Null,null等都定义为相同的值。
  • 找到一种方法来禁用围绕该行代码的NULL定义。我假设有一种方法可以做到这一点,但我对预处理器指令并不是很了解
  • 尝试使用空字符串而不是文字NULL。 Oracle应该将其转换为NULL。
  • 将语句的文本存储在配置文件中,并将其读入字符串。这样它实际上不会在代码中,所以预处理器不会修改它。
  • 在Oracle中编写一个只返回NULL的函数,并在语句中使用该函数而不是NULL文字。

答案 1 :(得分:1)

NULL是Oracle中的正确值。我没有从C ++调用Oracle的经验,所以我不知道你的问题的原因是什么,但它必须是客户端的一个问题。如果你通过Oracle的SQLPlus运行该语句,它应该做你想要的。

答案 2 :(得分:1)

NULL应按原样运行,但您可以尝试使用指示符变量,如下所述:http://download.oracle.com/docs/cd/B10500_01/appdev.920/a97269/pc_06sql.htm#424

答案 3 :(得分:0)

是 - 问题是在C ++中扩展NULL的方式。 对于informix,有rsetnull将varialble设置为适当的值。 对于oracle有什么这样的吗?

答案 4 :(得分:0)

您正在使用EXECUTE SQL语句,表示您在C或C ++程序中使用Oracles Pro * C.

如果预处理器正在对NULL进行一些转换,那么你就错过了一段编译过程。

在编译之前,您需要通过Pro * C预处理器运行源代码。它将EXEC SQL语句转换为c / c ++编译器可以编译的一系列结构和函数调用。

This link应该有助于解决一些概念。