У меня есть довольно простой теоретический сценарий, в котором я пытаюсь выбрать реляционные данные в базе данных DB2 для разработки и вставить в отдельный производственный сервер db2 (создание новых идентификаторов и связей на производственной стороне в процесс).
Итак, в этом сценарии I:
- Выберите из таблицы ITEM dev
- Сохраните исходный первичный ключ
- вставьте данные в таблицу Dev ITEM
- Получить идентификатор недавно вставленного
- выбрать SUBITEM из dev с исходным идентификатором
- для каждого подпункта, в который я вставляю данные в продукт Таблица SUBITEM с недавно созданным ИДЕНТИФИКАТОРОМ в качестве отношения
Проблема заключается в том, что скрипт на самом деле успешно выполняется, но при этом он просто увеличивается на единицу, поэтому, даже если он правильно вставляет каждый пункт, он завершается просто получить КАЖДЫЙ подэлемент в базе данных и сохранить исходный (1-й ряд) ID. Для экземпляра:
Мой первый выбор ITEM возвращает ID 1204. Когда я запускаю несколько элементов, в моей таблице ITEM отображаются записи с идентификаторами: 1204, 1205, 1206 и 1207
Это верно, но когда я смотрю на таблицу subITEMS, у меня есть 10 записей subITEM, все с itemID 1204. Таким образом, он получил правильный подпункт для каждой итерации ITEMS, но только когда-либо вставил самую первую переменную newID.
Что я сделал не так здесь:
if($DB2connDEV && $DB2connPROD){
$getDevItems = "
SELECT
itemt_ID,
DESCRIPTION
FROM itemt
";
$stmt = odbc_exec($DB2connDEV, $getDevItems);
while($gettingDevItems = odbc_fetch_array($stmt)){
$rows[] = $gettingDevItems;
}
foreach($rows as $row){
$prepInsert = odbc_prepare($DB2connPROD, "INSERT INTO itemt (itemt_id, description) VALUES(?,?)");
$originalID = $row['itemt_ID'];
$description = $row['DESCRIPTION'];
$insertTable = odbc_execute($prepInsert, array($description));
//Get newly created ID
$getIdentity = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";
$stmt = odbc_exec($DB2connPROD, $getIdentity);
$row = odbc_fetch_array($stmt);
$newID = $row['LASTID'];
if($newID) {
echo "Last Insert ID is : " . $newID . "\n";
} else {
echo "No Last insert ID.\n";
}
//Get subItems and insert
$getSubItems = "SELECT NAME, DESCRIPTION
FROM SUBITEMT
WHERE itemt_ID = $originalID";
$selectSubItems = odbc_exec($DB2connDEV, $getSubItems);
while($gettingSubItems = odbc_fetch_array($selectSubItems)){
$subItemRows[] = $gettingSubItems;
}
foreach($subItemRows as $subItemRow){
$subItemPrepInsert = odbc_prepare($DB2connPROD, "INSERT INTO subitemt (itemt_id, NAME, DESCRIPTION) VALUES(?,?,?)");
$subItemName = $subItemRow['NAME'];
$subItemDescription = $subItemRow['DESCRIPTION'];
$subtaskInsertExec = odbc_execute($subtaskPrepInsert, array($newID, $subItemName, $subItemDescription));
//get newly created ID for subitem
$getsubtaskID = "SELECT IDENTITY_VAL_LOCAL() AS LASTID FROM SYSIBM.SYSDUMMY1";
$subtaskIDSTMT = odbc_exec($DB2connPROD, $getsubtaskID);
$newsubItemRow = odbc_fetch_array($subtaskIDSTMT);
$newSubItemID = $newsubItemRow['LASTID'];
if($newSubItemID) {
echo "Last Insert subItem ID is : " . $newSubItemID . "\n";
} else {
echo "No Last insert subItem ID.\n";
}
}
}
odbc_close($DB2connPROD);
odbc_close($DB2connDEV);
}