DB2 选择设置参数,然后用参数值插入

Posted

技术标签:

【中文标题】DB2 选择设置参数,然后用参数值插入【英文标题】:DB2 select to set parameters and then insert with param values 【发布时间】:2018-11-20 14:04:51 【问题描述】:

我正在尝试使用 PDO 在 php 脚本中准备 DB2 插入,它给了我错误“参数标记或 NULL 无效”

我正在运行一个选择查询来获取值并将它们设置为参数,然后我设置了我的插入语句。我准备它,并在基于从第一个查询中获取的 while 循环中,设置参数,以便我能够使用我需要的值运行插入。问题是它在我准备插入的那一行失败了。

第一个查询运行并打印

[ORDERNUMBER] 123456
[CUSTOMER] 1
[PRODUCT] 123
[FABR] A
[COLOR] 1
[SHIPDATE] 20181119

所以数据回来了,我什至开始转换我的数据类型,但我仍然收到错误。

这是打印上述内容的初始选择:

//SELECT query to get source data
$getOrderDetails = "
    SELECT 
         cast(invnoc as int) as ORDERNUMBER,
         cast(cstnoc as int) AS CUSTOMER,
         cast(PRODUCTc as int) AS PRODUCT,
         cast(covr1c as int) AS FABR,
         cast(colr1c as int) AS COLOR ,
         cast(extd2d as varchar(45)) AS SHIPDATE,
    FROM testTable g
";

try 
    $orderDetailCheck = $DB2conn->prepare($getOrderDetails);
    $detailRslt = $orderDetailCheck->execute();
    $orderDetailCount = $orderDetailCheck->fetch();
    print_r($orderDetailCount);
catch(PDOException $ex) 
    echo "QUERY ONE FAILED!: " .$ex->getMessage();

插入语句:

$insertPlacement = "
    INSERT INTO table (CUSTOMER_id, start_date, expire_date)
    SELECT DISTINCT
        :CUSTOMER, 
        (to_date(:SHIPDATE, 'YYYYMMDD') + 7 DAYS)  as start_date,
        (to_date(:SHIPDATE, 'YYYYMMDD') + 127 DAYS)  as expire_date
    from OFSTable ofs
    WHERE  ofs.PRODUCT=:PRODUCT AND ofs.FABR1=:FABR AND ofs.color1=:COLOR;
";

设置参数:

//this line is failing
$insert = $DB2conn->prepare($insertPlacement);

while ($row2 = $orderDetailCheck->fetch(PDO::FETCH_ASSOC)) 

    $insertParams = [
        ":CUSTOMER" => $row2["CUSTOMER"],
        ":ORDERNUMBER" => $row2["ORDERNUMBER"],
        ":PRODUCT" => $row2["PRODUCT"],
        ":FABR" => $row2["FABR"],
        ":COLOR" => $row2["COLOR"],
    ];

我意识到问题是我不能将参数调用为列名或表名,但这在 mysql 中有效,不适用于 db2。我需要插入 :CUSTOMER 参数的值,但它的行为就像我不能那样做。我应该如何改变它以在 db2 上像在 Mysql 上一样工作?

【问题讨论】:

你试过转换所有参数吗? SELECT DISTINCT CAST(:CUSTOMER AS INT) ... fs.PRODUCT=CAST(:PRODUCT AS INT) ... 我相信你是对的。让我再尝试一件事,但我认为解决了它 完美,明白了!非常感谢,如果你回答我会接受 【参考方案1】:

您应该强制转换所有参数。像这样:

SELECT DISTINCT CAST(:CUSTOMER AS INT) ... fs.PRODUCT=CAST(:PRODUCT AS INT) ...

来源:

SQL Call builder returns 'A statement contains a use of a parameter marker that is not valid.. SQLCODE=-418, SQLSTATE=42610'

【讨论】:

以上是关于DB2 选择设置参数,然后用参数值插入的主要内容,如果未能解决你的问题,请参考以下文章

如何为 DB2 表值函数传递日期参数

关于db2 load命令多加一列参数值该怎么写?

如何调用采用日期参数的 DB2 AS400 表值函数

在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?

根据带有参数的选择(唯一键)从另一个表中插入值

DB2 - 使用带有字符串数组参数的 Dapper 选择查询将不会返回正确的结果