След като извлечете всички резултати във вашия цикъл за изпълнение, трябва да получите следващия набор от редове и след това да затворите курсора, преди да се опитате да изпълните отново съхранената процедура. Опитайте това:
foreach($data_arr AS $key => $val){
$values = $val;
$stmt->execute();
$res = $stmt->fetchAll();
$stmt->nextRowset(); // NEW: Get the next rowset after fetching your results
$stmt->closeCursor(); // NEW: Close the cursor
}
Наистина важното допълнение тук е извикването на nextRowSet() . Под капака PDO връща втори набор от редове до която трябва да получите достъп, преди да изпълните втора (и последваща) съхранена процедура в същата връзка.