DB2 вставляет значения меток времени и нулевые значения в столбец меток времени - PullRequest
1 голос
/ 17 февраля 2020

При выборе меток времени (которые могут иметь значение null по умолчанию) из исходной таблицы с помощью сценария PHP и при попытке вставить в идентичную таблицу назначения я получаю сообщение об ошибке «СИНТАКСИС значения даты, времени или отметки времени недопустим SQL состояние 22008 '. Я считаю, что это потому, что некоторые исходные записи являются нулевыми. Когда скрипт запускается, я получаю около половины записей, успешно вставленных в таблицу назначения, но только те, которые имеют фактические значения меток времени. Нулевые записи не были вставлены.

Мои заявления:

    SELECT
        TIMESTAMP_EXPIRATION
    FROM TABLE1;

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

Проблема в том, что половина моих исходных записей пуста, а другая половина - TIMESTAMP со степенью 6

Определение исходной и целевой таблиц имеет столбец как «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);
}

1 Ответ

1 голос
/ 17 февраля 2020

Рассмотрим параметризацию с подготовленным оператором , а не с интерполяцией строк, например, '$expiration', которая отображает null в пустую строку:

$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));
}
...