저장 프로 시저를 10 번 실행하는 PHP 코드가 있습니다. 하나의 스토어드 프로 시저 호출이 실패하면 계속 진행해야하고 마지막에는 트랜잭션을 커밋해야합니다.Oracle PL/SQL - OCI8을 실행하는 PHP에서 자동 롤백이 언제 실행됩니까?
그것은 기본적으로 다음과 같습니다 : 말, 제기 예외, 5 저장된 프로 시저 호출이있는 경우
는$connection = getConn();
foreach($row as $i=>$j) {
$SQL = "BEGIN MYPROC.EXECUTE(:VAL1, :VAL2); END;";
$statement = OCIParse($connection, $SQL);
oci_bind_by_name($statement, 'VAL1', $row[i]['FIRSTVAL']);
oci_bind_by_name($statement, 'VAL2', $row[i]['SECONDVAL']);
$success = @OCIExecute($statement, OCI_DEFAULT);
if(!$success) {
print 'Exception in stored proc call';
}
else {
print 'Success';
}
}
oci_commit($connection);
내 질문은, 것이라고 롤 다시 모든 저장된 프로 시저는 그 시점까지 호출한다 ?
좋은 질문입니다. 다섯 번째 저장된 proc 호출이 실패 할 때 어떤 행동을 보이고 있습니까? – FrustratedWithFormsDesigner
아무 것도 굴러 가지 않습니다. 성공적인 실행은 모두 커밋됩니다. 그래서이 사이트의 1.10.4 (http://soft.buaa.edu.cn/oracle/bookshelf/Orilly/langpkt/ch01_10.htm)에서 처리되지 않은 예외가 롤백 될 것이므로 혼란 스럽습니다. 컨트롤이 호출 응용 프로그램으로 반환되었습니다. –
이 페이지의 내용은 다르게되어 있습니다. http://www.stanford.edu/dept/itss/docs/oracle/10g/appdev.101/b10807/07_errs.htm#i3372 "처리되지 않은 예외 잡기"섹션에는 "처리되지 않은 예외 또한 서브 프로그램을 성공적으로 종료하면 PL/SQL은 OUT 매개 변수에 값을 할당하지만 처리되지 않은 예외로 종료하면 PL/SQL은 NOCOPY 매개 변수가 아닌 경우 OUT 매개 변수에 값을 할당하지 않습니다.또한 저장된 서브 프로그램이 처리되지 않은 예외로 실패하는 경우 PL/SQL은 서브 프로그램이 수행 한 데이터베이스 작업을 롤백하지 않습니다. " –