这感觉就像一个愚蠢的问题,但我在Oracle事务管理概念指南中看到以下内容:
当发生以下任何情况时,交易结束:
用户发出不带SAVEPOINT子句的COMMIT或ROLLBACK语句.
用户运行DDL语句,例如CREATE,DROP,RENAME或ALTER.如果当前事务包含任何DML语句,Oracle首先提交事务,然后运行并将DDL语句作为新的单语句事务提交.
用户断开与Oracle的连接.当前事务已提交.
用户进程异常终止.当前事务将回滚.
我是否要解释最后一点意味着如果我发出一个有错误的查询,那么事务将被回滚?
以下文本是oracle文档的摘录Oracle®DatabasePL/SQL语言参考11g第1版(11.1):
未处理的异常也会影响子程序.如果成功退出子程序,PL/SQL会将值分配给OUT参数.但是,如果退出时出现未处理的异常,则PL/SQL不会为OUT参数赋值(除非它们是NOCOPY参数).此外,如果存储的子程序因未处理的异常而失败,则PL/SQL不会回滚子程序完成的数据库工作.
注意粗体文字,这是真的吗?我很好奇,所以我写了下面的例子来测试它.
-- create a test table
CREATE TABLE e AS SELECT * FROM HR.EMPLOYEES;
-- create p1 which will update a row in table e
CREATE OR REPLACE PROCEDURE p1
IS
ex EXCEPTION;
row e%ROWTYPE;
BEGIN
select * into row from e where employee_id=100;
row.employee_id := 100;
row.first_name := 'yang';
-- update
UPDATE e set ROW = row where employee_id = 100;
-- and raise an error
RAISE ex;
END;
BEGIN
-- call the upper …Run Code Online (Sandbox Code Playgroud)