【问题标题】:DBD::Oracle insert sydate instead of nullDBD::Oracle 插入 sydate 而不是 null
【发布时间】:2014-03-24 11:21:15
【问题描述】:

我尝试从 perl 将空值插入 Oracle 中的日期字段,但最终插入的是 sysdate,而不是空值。当我从 sqlplus 执行相同操作时,它会插入空值。

我的代码(只是重要的部分)

use DBI;
use DBD::Oracle qw(ORA_RSET);

...

eval {
    $sth = $dbh->prepare(q{
         INSERT INTO MY_TABLE
             (VAL1, VAL2, VAL3, ENTRY_DATE, PROCESSED_DATE)
         VALUES (?,?,?,?,?)});
    my $rv = $sth->execute($VAL1, $VAL2, $VAL3, undef, undef);
    $insert_counter++;
};
if ( $@ ) {
    $FILE_PROCESS_STATUS = FILE_INVALID;
    logg("e", "$@");
}
if ( $FILE_PROCESS_STATUS = FILE_VALID ) {
    $dbh->commit;
}

【问题讨论】:

  • 我建议您检查 PHP 如何处理空值。这里所做的是 PHP 正在向查询中添加绑定变量或占位符。 undef 的使用 - 你确定 PHP 将 undefnull 值传递给日期字段吗?
  • ""而不是undef是一样的吗?
  • Rachcha:正如描述和标签中提到的,它是 perl,而不是 php。 :) mpapec:基于 DBD::Oracle 的文档,我必须使用 undef,因为它是空值。 orafaq.com/wiki/Perl#DBD::Oracle_and_NULL_values
  • 能否提供SQL*Plus执行的例子(insert语句的全栈和之后的选择结果)。它还提供表定义 DDL。

标签: sql oracle perl


【解决方案1】:

您可以使用DBI->trace 记录操作并实际查看正在准备的语句。 请参阅this question 的答案。这应该会告诉您是否正在创建错误的 SQL 查询。

不过,我敢打赌,问题出在你想的不一样。使用调试器验证您的这段代码是否确实导致了问题,或者创建一个简单的示例脚本来测试这是否真的是问题。

【讨论】:

  • 这是非常有用的丹,我会听从你的建议,并会返回结果。
  • 很遗憾,但是我在错误的地方修改了代码。我制作了一个简单的脚本,它正在工作,但我意识到我正在修改错误的分支。很抱歉,感谢大家的帮助,尤其是对你 dan :)
猜你喜欢
  • 2021-12-17
  • 1970-01-01
  • 2013-08-21
  • 2016-08-30
  • 2020-02-02
  • 2012-07-18
  • 1970-01-01
  • 2022-07-28
  • 1970-01-01
相关资源
最近更新 更多