在 oracle 10g 中,每个表的每个操作(插入、选择、更新、删除)都有一个存储过程。实际上,每个操作每个表可以有多个过程,例如在选择的情况下,它可以是 SelectList、SelectOneRecord、Search(使用动态查询)。
这些程序都没有事务。
有时我必须在一个事务中组合多个操作。例如,在一个表中插入并在另一个表中更新,都在一个事务中。为此,我制作了一个具有事务的单独程序。这个程序然后调用这两个程序。
为了在单个事务中启用上述组合过程调用,我没有在过程中放置任何事务行为,如上所述。
大多数时候我只需要执行一项操作,例如在一张表中插入。由于插入过程没有事务行为,因此我必须创建一个具有事务行为的单独过程,并且该过程调用插入过程。
我最终得到了许多基本程序(一张表,一项操作)和许多基本上是基本程序包装器的事务程序。
我的问题是,是否有某种方法可以在基本程序中具有条件事务行为。我的意思是一些 if 条件,我可以在其中放置事务逻辑,以便事务行为可以根据我传递的某些参数打开或关闭。然后当我只想做一个操作时,比如在一个表中插入,我调用带有事务行为的基本过程;而当我想在一个事务中调用两个过程,例如在一个事务中插入一个表并在另一个表中更新全部在一个事务中,然后我制作一个单独的事务过程并调用两个没有事务行为的基本过程。
以下是调用另一个过程并将其包装在事务中的事务过程:
BEGIN
SAVEPOINT the_start;
BasicProcedure(<list of parameters>);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK TO the_start;
RAISE;
END;
END;
我可以很好地将保存点行和提交行放在 if 语句中,但我也可以将异常块放在 if 语句中。我必须将异常块放在 if 语句中吗?如果我在程序中捕获异常怎么办,当异常发生时它会自动回滚吗?