我有一个PHP数组,来自数据库。这个数组我想插入到不同的数据库/表。两个字段(WEBINV_ID,HOSTNAME)是唯一的。我会每天更新这些表格每个脚本。如果条目存在,他们必须跳过插入,并应使用更新。这工作得很好。但是,如果我在运行PHP for循环,只会插入或更新数组的第一个进入新表 我用合并到一个PHP ARRAY插入表和为了循环
MERGE INTO TABLE ...
了点。 这是我输入数组:
[0] => Array
(
[CI_ID] => 39778
[NODEALIAS] => rt-2
[NODE] => 10.1.2.3
[SERIALNUMBER] => 8374378584
[VENDORNAME] => Cisco
[STATUS] => active
)
[1] => Array
(
[CI_ID] => 72909
[NODEALIAS] => rt-1
[NODE] => 10.1.1.3
[SERIALNUMBER] => 1276731237
[VENDORNAME] => Cisco
[STATUS] => active
)...
这里是我的循环,我尝试插入或更新我的所有设备。
for ($i = 0; $i < count($router); $i++) {
$sql = "MERGE INTO DEVICES USING (SELECT "
. "'" . $router[$i]['CI_ID'] . "' AS WEBINV_ID,"
. "'" . $router[$i]['NODEALIAS'] . "' AS DEVICE_NAME,"
. "'" . $router[$i]['NODE'] . "' AS NODE,"
. "'" . $router[$i]['SERIALNUMBER'] . "' AS SERIALNUMBER,"
. "'" . $router[$i]['VENDORNAME'] . "' AS VENDORNAME,"
. "'" . $router[$i]['STATUS'] . "' AS STATUS,"
. "CURRENT_TIMESTAMP AS DEVICE_INSERT FROM DUAL
) S ON ('" . $router[$i]['CI_ID'] . "' = S.WEBINV_ID
OR '" . $router[$i]['NODEALIAS'] . "' = S.DEVICE_NAME)
WHEN MATCHED THEN UPDATE SET STATUS = '" . $router[$i]['STATUS'] . "', DEVICE_UPDATE = CURRENT_TIMESTAMP
WHEN NOT MATCHED THEN INSERT(WEBINV_ID,DEVICE_NAME,NODE,SERIALNUMBER,VENDORNAME,STATUS,DEVICE_INSERT)
VALUES ('" . $router[$i]['CI_ID'] . "',"
. "'" . $router[$i]['NODEALIAS'] . "',"
. "'" . $router[$i]['NODE'] . "',"
. "'" . $router[$i]['SERIALNUMBER'] . "',"
. "'" . $router[$i]['VENDORNAME'] . "',"
. "'" . $router[$i]['STATUS'] . "',"
. "CURRENT_TIMESTAMP)";
$stid = oci_parse($gnedb, $sql);
oci_execute($stid); // executes and commits
}
我试过用“oci_bind_by_name”相同的代码,但结果却是一样的,只是从阵列中使用的第一个条目。任何想法?
一条记录被合并的事实表明SQL语句是正确的。添加一个echo $ sql;声明在oci_execute语句之前。数据中可能存在导致问题的内容。另一种方法 - 通过在oci_execute之后放置必要的oci错误语句来实际执行语句。 – jeff
你确定该数组包含你认为它包含的内容吗? – Mihai