2

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

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

当我在 HPUX 上使用 C++ 运行它时,0L 用于 null 而在 Linux 上,语句失败并显示illegal value.

是否有我可以使用的通用 Oracle 空值/方法?

4

5 回答 5

4

哦,现在我意识到一定会发生什么。C++ 系统标头具有#define NULL 0L(在 HPUX 中),因此硬编码的 NULL 将被预处理器替换为该值。

几个想法:

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

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

于 2008-11-20T13:54:18.373 回答
1

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

于 2008-11-20T14:13:14.480 回答
0

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

于 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 回答