以下のシナリオで、BEGIN TRANSACTION/END TRANSACTIONの使用法の例を示します。
シナリオ: 削除する明示的なトランザクション
departmentテーブルにemp_count列が入っていると想定すると、次のような明示したトランザクションを使用して、employeeテーブルから1行を削除し、departmentテーブルの部門の人数を減らすことができます。
BEGIN TRANSACTION; DELETE FROM employee WHERE name = 'Reed C'; UPDATE department SET emp_count = emp_count -1 WHERE dept_no = 500; END TRANSACTION;
シナリオ: 挿入する明示的なトランザクション
次の例は、明示的なトランザクションです。この例では、各INSERT文がUSINGリクエスト修飾子と関連付けられています。
BEGIN TRANSACTION ; USING ssnumfile (INTEGER) INSERT INTO employee (soc_sec_no) VALUES (:ssnumfile) ; USING ssnumfile (INTEGER) INSERT INTO employee (soc_sec_no) VALUES (:ssnumfile) ; USING ssnumfile (INTEGER) INSERT INTO employee (soc_sec_no) VALUES (:ssnumfile) ; END TRANSACTION ;
シナリオ: DDL文の明示的なトランザクション
次の例は、明示的なトランザクション内のDDL文の使用の例です。これらのトランザクションでは揮発テーブルを作成し、集約演算の結果に対して別の集約演算を実行し、その後、初めてのトランザクションで作成された揮発テーブルを削除します。
DDL文はトランザクション内の唯一の文であるか、またはトランザクション内の最後の文である必要があるので、2つのトランザクションが使用されています。
BEGIN TRANSACTION; CREATE VOLATILE TABLE dept_sum_sal NO LOG ( dept_no SMALLINT FORMAT '999' BETWEEN 100 AND 900 NOT NULL, sum_sal DECIMAL(8,2) FORMAT 'ZZZ,ZZ9.99') PRIMARY INDEX(dept_no), ON COMMIT DELETE ROWS; END TRANSACTION; BEGIN TRANSACTION; INSERT INTO dept_sum_sal SELECT dept_no, SUM(salary) FROM employee GROUP BY dept_no; SELECT AVG(sum_sal) FROM dept_sum_sal; DROP VOLATILE TABLE dept_sum_sal; END TRANSACTION;
シナリオ: 暗黙的トランザクション(BTEQ)
次の例は、BTEQの複文リクエストとして構成されており、そのため、単一の暗黙的トランザクションとして処理されます。
USING修飾子とセミコロンの位置に注意してください。この構成では、いずれかのWHERE条件の失敗によりトランザクションはアボートされ、実行されたすべての挿入と更新の操作は元に戻されます。
USING var1(CHARACTER), var2(CHARACTER), var3(CHARACTER) INSERT INTO test_tab_u (c1) VALUES (:var1) ; INSERT INTO test_tab_u (c1) VALUES (:var2) ; INSERT INTO test_tab_u (c1) VALUES (:var3) ; UPDATE test_tab_u SET c2 = c1 + 1 WHERE c1 = :var1 ; UPDATE test_tab_u SET c2 = c1 + 1 WHERE c1 = :var2