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 选择设置参数,然后用参数值插入的主要内容,如果未能解决你的问题,请参考以下文章
在 Java DB2 JDBC 中:如何在 SELECT 语句的 WHERE 子句中使用空参数,其中值可以为空或不为空?