|
SAVEPOINT は、ロール バック可能なトランザクション内のポイントを定義します。
SAVEPOINT セーブポイント名 セーブポイント名 ::= ユーザー定義名
AUTOCOMMIT がオフの場合、ROLLBACK、SAVEPOINT、およびRELEASE はセッション レベル(ストアド プロシージャの外部)でのみサポートされます。そうでない場合、ROLLBACK、SAVEPOINT、およびRELEASE はストアド プロシージャ内で使用しなければなりません。
ストアド プロシージャ内でコミットされたステートメントは、呼び出し元の ODBC アプリケーションの一番外側のトランザクションによって制御されます。これはつまり、SQLSetConnectOption で指定された AUTOCOMMIT モードに従って、ODBC アプリケーションから外部的に呼び出しているストアド プロシージャが、2 種類ある動作のうち 1 つを実行するということです。自動的にコミットする(AUTOCOMMIT がオン、デフォルト)か、SQLTransact が SQL_COMMIT または SQL_ROLLBACK で呼び出されるのを待つ(AUTOCOMMIT がオフに設定されている場合)のいずれかです。
SAVEPOINT は、それが定義されているプロシージャにのみ適用されます。つまり、別のプロシージャ内に定義されている SAVEPOINT は参照できません。
次の例では、SAVEPOINT を設定し、その後で条件を調べて SAVEPOINT を ROLLBACK するか RELEASE するかが判断されます。
CREATE PROCEDURE Enroll_student(in :student ubigint, IN :classnum integer); BEGIN DECLARE :CurrentEnrollment INTEGER; DECLARE :MaxEnrollment INTEGER; SAVEPOINT SP1; INSERT INTO Enrolls VALUES (:student, :classnum, 0.0); SELECT COUNT(*) INTO :CurrentEnrollment FROM Enrolls WHERE class_id = :classnum; SELECT Max_size INTO :MaxEnrollment FROM Class WHERE ID = :classnum; IF :CurrentEnrollment >= :MaxEnrollment THEN ROLLBACK to SAVEPOINT SP1; ELSE RELEASE SAVEPOINT SP1; END IF; END;
COUNT(式) によって、述部にある式の非ヌル値がすべてカウントされるということを覚えておいてください。COUNT(*) ではヌル値を含むすべての値がカウントされます。
|