【问题标题】:PL/SQL - setting null valuePL/SQL - 设置空值
【发布时间】:2010-09-23 06:01:28
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c++ sql oracle plsql


    【解决方案1】:

    您使用 EXECUTE SQL 语句的事实表明您在 C 或 C++ 程序中使用 Oracles Pro*C。

    如果预处理器在 NULL 上做一些翻译,那么你错过了一段编译过程。

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

    This link 应该对一些概念有所帮助。

    【讨论】:

      【解决方案2】:

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

      几个想法:

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2019-06-29
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-05-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多