Po pobraniu wszystkich wyników w pętli wykonywania należy pobrać następny zestaw wierszy, a następnie zamknąć kursor przed ponowną próbą wykonania procedury składowanej. Spróbuj tego:
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
}
Naprawdę ważnym dodatkiem jest tutaj wywołanie nextRowSet() . Pod maską PDO zwraca drugi zestaw wierszy do których musisz uzyskać dostęp przed wykonaniem drugiej (i kolejnych) procedury składowanej na tym samym połączeniu.