Я пытаюсь изменить скрипт, который имеет очень простой запрос SELECT, запущенный в DB2. Мне нужно сохранить этот набор результатов, желательно в блоке массива, поэтому я могу запускать его партиями, но в массиве, тем не менее, а затем мне нужно использовать эти значения в INSERT/SELECT на MYSQL.
Я думаю, после некоторой обратной связи, что мне, возможно, придется использовать результаты 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 | Frame | GroupID | cover | color
------------------------------------
15 1234 1 12 1
16 1235 2 12 1
17 1236 3 12 1
Затем ниже, мне нужно сделать вставку ранее определенного идентификатора, а также некоторые данные из исходного запроса DB2 (введите стиль в groupID, дилер в дилерский идентификатор, отправьте его в стартовую дату, места размещения в места размещения)
INSERT приведет к: (таблице скручивания)
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/temp.
Вот сценарий:
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. Надеюсь, мой макет наверху имеет смысл.
Я могу ответить на любые вопросы, чтобы уточнить.
Я бы сделал это внутри цикла, где вы извлекаете строки из 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.