DB2 将时间戳值和空值插入到可为空的时间戳列中
DB2 inserting both timestamp values and null values into a nullable timestamp column
当通过 PHP 脚本从源 table 选择时间戳(可以为空,默认为空)并尝试插入相同的目标 table 时,
我收到错误 'SYNTAX of date, time or timestamp value not valid SQL state 22008'。我相信这是因为某些源记录为空。当脚本运行时,我将大约一半的记录成功插入到我的目标 table 中,但只有那些具有实际时间戳值的记录。尚未插入空记录。
我的陈述:
SELECT
TIMESTAMP_EXPIRATION
FROM TABLE1;
INSERT INTO TABLE2 (EXPIRATION_T)
VALUES ($TIMESTAMP_EXPIRATION);
问题是我的源记录有一半是空的,另一半是TIMESTAMP,度数为6
源和目标的定义 table 的列为 '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);
}
考虑使用 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));
}
当通过 PHP 脚本从源 table 选择时间戳(可以为空,默认为空)并尝试插入相同的目标 table 时, 我收到错误 'SYNTAX of date, time or timestamp value not valid SQL state 22008'。我相信这是因为某些源记录为空。当脚本运行时,我将大约一半的记录成功插入到我的目标 table 中,但只有那些具有实际时间戳值的记录。尚未插入空记录。
我的陈述:
SELECT
TIMESTAMP_EXPIRATION
FROM TABLE1;
INSERT INTO TABLE2 (EXPIRATION_T)
VALUES ($TIMESTAMP_EXPIRATION);
问题是我的源记录有一半是空的,另一半是TIMESTAMP,度数为6
源和目标的定义 table 的列为 '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);
}
考虑使用 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));
}