批量/批量选择并插入php

时间:2018-02-27 16:49:23

标签: php sql db2 odbc

我有一个脚本在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();
}

0 个答案:

没有答案