我有一个脚本在DB2上运行select,然后插入到数据库中。
这很有效,但有一个问题:我有500,000条记录,我需要找到一种非详尽的方法来做到这一点。目前,我一直在PowerShell中运行它,但我的脚本一次只能选择1000个查询,这将需要永远。
我希望我能稍微修改一下以避免任何错误或超时/内存问题,如果有意义,可以选择前500,插入,然后重新开始。
我知道还有array_chunk但是我从来没有使用它,所以我不知道如何去做。什么是我可以预先形成这个,直到select基本上是空的?
脚本部分:
//DB2 Select query
$plcQueryDB2 = "
select
cstnoc AS DEALER,
framec AS FRAME,
covr1c AS COVER,
colr1c AS COLOR ,
extd1d AS SHIPDATE,
orqtyc AS QUANTITY
FROM GPORPCFL
group by invnoc,cstnoc, slsnoc, orqtyc, framec, covr1c,colr1c, extd1d
order by invnoc asc
limit 200
";
var_dump ($plcQueryDB2);
//prepare and execute on db2
$prep = odbc_prepare($DB2Conn, $plcQueryDB2);
$exec = odbc_execute($prep);
$result = odbc_exec($DB2Conn, $plcQueryDB2);
try{
while($arr = odbc_fetch_array($result))
{
$stmt = $PDO->prepare("
INSERT INTO placements (sku_id, group_id, dealer_id, start_date, expire_date,locations)
SELECT id, sku_group_id, :DEALER, DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 27 DAY) as start_date,
DATE_ADD(DATE_FORMAT(CONVERT(:SHIPDATE, CHAR(20)), '%Y-%m-%d'),INTERVAL 127 DAY) as expire_date, :QUANTITY
FROM skus s
WHERE s.frame=:FRAME AND s.cover1=:COVER AND s.color1=:COLOR
");
$PDO->beginTransaction();
$i = 0;
while($db2row = odbc_fetch_array($result)) {
if(++$i % 1000 == 0) {
$PDO->commit();
$PDO->beginTransaction();
}
$stmt->execute($db2row);
}
$PDO->commit();
}
}catch (PDOException $e){
print "ERROR!: " . $e->getMessage() . "<br/>";
die();
}