【问题标题】:Inserting into mysql table based on results from a db2 query in php script根据 php 脚本中 db2 查询的结果插入 mysql 表
【发布时间】:2018-02-26 15:43:16
【问题描述】:

我正在尝试修改一个脚本,该脚本在 DB2 上运行了一个非常基本的 SELECT 查询。我需要存储该结果集,最好存储在一个数组块中,以便我可以分批运行它,但仍然在一个数组中,然后我需要在 MYSQL 上的 INSERT/SELECT 中使用这些值。

经过一些反馈后,我想我可能不得不将 DB2 结果用作常量,但我真的不知道该怎么做。

这是我如何选择的模型,以及我需要如何根据选择结果集和另一个 mysql 表上的子查询进行插入:

我从这里选择: DB2 查询结果

Invoice | Dealer | Rep | quantity | Frame | Cover | Color | Placements | shipdate
---------------------------------------------------------------------------------
100        123     250     1         1234    12       1         2         20180219
101        321     250     1         1235    12       1         2         20180219
102        432     250     1         1236    12       1         2         20180219

我需要在某种意义上将前面的数据加入到后面的数据中 SKU 表(db2.style = sku.groupID、db2.frame = sku.frame、db2.cover = sku.cover 和 db2.color = sku.color)以获取正确的 ID

ID | Frame | GroupID | cover | color 
------------------------------------
15    1234      1        12      1
16    1235      2        12      1
17    1236      3        12      1

然后在下面,我需要插入先前确定的 ID,以及原始 DB2 查询中的一些数据(将 style 插入 groupID,dealer 插入dealerID,shipdate 插入 startdate,placement 插入placement)

INSERT 将导致:(skuplacement 表)

sku_id | groupID | dealerID | startDate | expirationDate          | placements
------------------------------------------------------------------------------
15          1       123        20180226    (shipdate + 127 days)       2
16          2       123        20180226    (shipdate + 127 days)       2
17          3       123        20180226    (shipdate + 127 days)       2

我知道我不能在 DB2 和 MySQL 之间加入,所以我需要一种方法来在数组中使用我选择的值,并将这些变量用于 mysql INSERT 和 Sub-Query。我希望我可以在 PHP 脚本中完成这一切,而不是 CSV/临时表方法。

这是脚本:

try {
                $DB2Conn = odbc_connect("","", "");

                if(!$DB2Conn){
                  die("Could not connect");
                }else{
                    echo"Connected to DB2";
                }

                $plcQueryDB2 = " 

                        select  invnoc AS INVOICE,
                                cstnoc AS DEALER,
                                slsnoc AS REP,
                                orqtyc AS QUANTITY,
                                framec AS FRAME,
                                covr1c AS COVER,
                                colr1c AS COLOR ,
                                extd1d AS SHIPDATE
                          FROM GPORPCFL
                          group by invnoc,cstnoc, slsnoc, orqtyc, framec, covr1c,colr1c, extd1d
                          limit 200
                ";

                $prep = odbc_prepare($DB2Conn, $plcQueryDB2);
                $exec = odbc_execute($prep);
                $result = odbc_exec($DB2Conn, $plcQueryDB2);
            }
            catch(Exception $e) {  
                echo $e->getMessage();  
            } 

            $array = array();

            //$i = 0;
            while($arr = odbc_fetch_array($result)) 
            {

                // if(++$i % 200 == 0) {

                // }

                $array[] = $arr;
                //echo $arr;

            }




            //Put $result into array chunk, process records in hundreds, possibly by 200 at a time

            //Logic for the query results Insert/ Upsert
            //This is pseudo code
            // if ($row['placements'] < count){   //Here, I am iterating to ensure that there are only as many records inserted as there are placements. 3 placements = 3 records

            // $insertsql = "

            // ";
            // }

在插入之后我有一些伪代码和一些没有完全解决的逻辑,但我首先需要解决的主要问题是如何以一种我可以将我的 db2 结果集等同于字段的方式插入在一个 mysql 表中,然后将所有这些结果放入第三个 mysql 表中。希望我在顶部的模型是有意义的。

我可以回答任何问题来澄清。

【问题讨论】:

  • 我删除了另一个问题,这是为了反映最近的变化而修改的
  • 一种简单的方法是使用值从 db 1 检索结果,然后使用按钮将相同的值插入 db 2 。像一个表格。
  • 我不确定这将如何工作?没有接口,这是一个每天运行的 php 脚本,用于从 DB2 获取遗留数据,将其中一些值等同于 mysql 中的表,然后从中获取结果集并插入到最终的 mysql 表中
  • 你想重新发明一个轮子?你见过dbconvert.com/db2/mysql 吗?你知道 Db2(如果获得 Infosphere Federation Server 许可证)可以在配置后加入 mysql(通过 jdbc 包装器或 odbc 包装器)?
  • @mao 我以前从未见过,我们的生产服务器上没有运行它,但我可以调查一下。我只是觉得可能有一种相当简单的方法可以在 php 脚本中实现这一点。如果我只是选择和插入,这没什么大不了的,但我必须将其中一些 DB2 值等同于 mysql 值

标签: php mysql db2


【解决方案1】:

我会在从 DB2 获取行的循环中执行此操作。

假设您有一个 PDO 连接 $pdo 到您的 MySQL 数据库。

$stmt = $pdo->prepare("
    INSERT INTO skuplacement (sku_id, groupID, dealerID, startDate, expirationDate, placements)
    SELECT id, groupID, :DEALER, :SHIPDATE, :PLACEMENTS
    FROM sku
    WHERE groupID=:STYLE AND frame=:FRAME AND cover=:COVER AND color=:COLOR
");

$pdo->beginTransaction();
$i = 0;
while($db2row = odbc_fetch_array($result)) {

    if(++$i % 1000 == 0) {
        $pdo->commit();
        $pdo->beginTransaction();
    }

    $stmt->execute($db2row);

}
$pdo->commit();

PDO 允许您将关联数组传递给execute(),并且数组键与准备好的查询中的命名参数占位符匹配。但是您的关联数组必须具有与参数完全相同相同的一组键。

因此,您需要将 DB2 查询更改为仅返回 STYLE、DEALER、FRAME、COVER、COLOR、SHIPDATE、PLACEMENTS。

【讨论】:

  • 哦,我明白了,因为显然不需要发票日期。所以这需要存储的 DB2 变量,这也有助于解决数组块问题。谢谢,我即将把它集成到我的脚本中并玩一下!
  • 快速问题@bill Karwin,我有一个名为 $conn 的普通 MySQL 连接。我必须将其更改为 PDO 吗?
  • 我假设你的意思是 $conn 是一个 mysql 或 mysqli 连接(它可能是,我无法从你的陈述中看出)。我建议大家切换到 PDO,它是唯一支持将数组传递给 execute() 的 PHP 数据库扩展。
  • 是的,它是 mysqli,对不起。好的,那我创建一个 PDO 连接,谢谢!
  • 我能问一下这条线在做什么吗:if(++$i % 1000 == 0) { $pdo-&gt;commit(); $pdo-&gt;beginTransaction(); }
猜你喜欢
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 2016-11-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-13
  • 1970-01-01
相关资源
最近更新 更多