【问题标题】:DB2 inserting both timestamp values and null values into a nullable timestamp columnDB2 将时间戳值和空值都插入到可为空的时间戳列中
【发布时间】:2020-06-01 13:39:29
【问题描述】:

当通过 PHP 脚本从源表中选择时间戳(默认为空时可以为空)并尝试插入到相同的目标表中时, 我收到错误“日期、时间或时间戳值的语法无效 SQL 状态 22008”。我相信这是因为一些源记录是空的。当脚本运行时,我将大约一半的记录成功插入到我的目标表中,但只有那些具有实际时间戳值的记录。未插入空记录。

我的陈述:

    SELECT
        TIMESTAMP_EXPIRATION
    FROM TABLE1;

    INSERT INTO TABLE2 (EXPIRATION_T)
    VALUES ($TIMESTAMP_EXPIRATION);

问题是我的源记录有一半是空的,另一半是6度的TIMESTAMP

源表和目标表的定义列分别为“TIMESTAMP_EXPIRATION FOR COLUMN 0011TTT TIMESTAMP DEFAULT NULL”和“EXPIRATION_T FOR COLUMN 00EETTT TIMESTAMP DEFAULT NULL”

我该怎么做才能让空值也插入?

更新:创建声明

 CREATE TABLE TABLE1 ( 
    ID INTEGER GENERATED ALWAYS AS IDENTITY ( 
    START WITH 1 INCREMENT BY 1 ),

    TIMESTAMP_EXPIRATION FOR COLUMN 0011TTT TIMESTAMP DEFAULT NULL )   

    RCDFMT TABLE1      ; 

CREATE TABLE TABLE2 ( 
    ID INTEGER GENERATED ALWAYS AS IDENTITY ( 
    START WITH 1 INCREMENT BY 1 ),

    EXPIRATION_T} FOR COLUMN 00EETTT TIMESTAMP DEFAULT NULL )   

    RCDFMT TABLE2      ; 

更新:PHP 脚本

    $getDev = "
    SELECT 
        ID,
        TIMESTAMP_EXPIRATION 
    FROM TABLE1
";

$stmt = odbc_exec($DB2connDEV, $getDev);

while($gettingItems = odbc_fetch_array($stmt)){

    $rows[] = $gettingItems;
}

foreach($rows as $row){

    $originalID = $row['ID'];
    $expiration = $row['TIMESTAMP_EXPIRATION'];


    $insertTable = "INSERT INTO table2 (id,expiration_t) VALUES (
        $originalID,
        '$expiration')";

    $stmt = odbc_exec($DB2connPROD, $insertTable);
}

【问题讨论】:

  • 粘贴最少的CREATE TABLE... 代码,我们可以用来在您的问题中重现您的问题。包括 TABLE1 和 TABLE2。当您尝试插入 NULL 时,$TIMESTAMP_EXPIRATION 的值是多少?它是空的吗? (没有引号,没有空格,不是空字符串。)
  • @MikeSherrill'CatRecall' 当我尝试插入空行时,我只是收到错误消息,但它根本没有插入。有问题的行将 <null> 作为源表中的值
  • 但是在控制台中打印这些行它只显示空白
  • 请显示 PHP 脚本,以便我们可以看到正在传递的参数。请记住,空字符串与 PHP 和 SQL 中的 null 不同。
  • @Parfait 也刚刚更新了 php 脚本

标签: sql db2 db2-400


【解决方案1】:

考虑使用prepared statement 进行参数化,而不是字符串插值,例如将null 呈现为空字符串的'$expiration'

$apn_stmt = odbc_prepare($DB2connPROD, "INSERT INTO table2 (id, expiration_t) VALUES (?, ?)");
$sel_stmt = odbc_exec($DB2connDEV, "SELECT ID, TIMESTAMP_EXPIRATION FROM TABLE1");

while($gettingItems = odbc_fetch_array($sel_stmt)) { 
    $rows[] = $gettingItems; 
} 

foreach($rows as $row) { 
    $originalID = $row['ID'];
    $expiration = ($row['TIMESTAMP_EXPIRATION'] == '' ? NULL : $row['TIMESTAMP_EXPIRATION']);
    $insertTable = odbc_execute($apn_stmt, array($originalID, $expiration));
}

【讨论】:

  • 好的,我确实尝试过这个,现在似乎 NULL 给了我这个问题“无效的参数号 SQL 状态 S1002
  • 可能 fetch 返回空字符串而不是 null。通过在循环中回显is_null($row['TIMESTAMP_EXPIRATION']) 进行检查。并查看使用三级运算符进行更新检查和分配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多