在oracle 10g中,每个操作每个表有一个存储过程(插入,选择,更新,删除).实际上每个操作每个表可以有多个过程,例如在select的情况下,它可以是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;
Run Code Online (Sandbox Code Playgroud)
我可以很好地将保存点行和提交行放在if语句中,但是我也可以将异常块放在if语句中.我是否必须在if语句中放置异常块?如果我在程序中捕获异常怎么办,它会在异常到来时自动回滚吗?
以下程序:
create or replace
PROCEDURE ChangePassword
(
p_Name VARCHAR2,
p_Password VARCHAR2
)
AS
EXECUTE IMMEDIATE 'ALTER USER :a IDENTIFIED BY :b' USING p_Name, p_Password;
END;
Run Code Online (Sandbox Code Playgroud)
成功编译,但执行时:
exec ChangePassword('TestUser', 'newPassword');
Run Code Online (Sandbox Code Playgroud)
导致错误:
01935. 00000 - "missing user or role name"
*Cause: A user or role name was expected.
*Action: Specify a user or role name.
Run Code Online (Sandbox Code Playgroud)
为什么?