Sql 如果Rollback语句在不指定保存点的情况下调用呢
我们可以在Oracle中创建保存点,然后通过调用Sql 如果Rollback语句在不指定保存点的情况下调用呢,sql,oracle,plsql,Sql,Oracle,Plsql,我们可以在Oracle中创建保存点,然后通过调用回滚到保存点,回滚到特定的保存点 UPDATE employees SET salary = 7000 WHERE last_name = 'Banda'; SAVEPOINT banda_sal; UPDATE employees SET salary = 12000 WHERE last_name = 'Greene'; SAVEPOINT greene_sal; SELECT SUM(salary)
回滚到保存点
,回滚到特定的保存点
UPDATE employees
SET salary = 7000
WHERE last_name = 'Banda';
SAVEPOINT banda_sal;
UPDATE employees
SET salary = 12000
WHERE last_name = 'Greene';
SAVEPOINT greene_sal;
SELECT SUM(salary) FROM employees;
ROLLBACK; --> the rollback without the savepoint
UPDATE employees
SET salary = 11000
WHERE last_name = 'Greene';
COMMIT;
有人能解释一下上面的代码是如何工作的吗
这立刻可以被视为一个愚蠢的问题。但在某些情况下,很难确定在复杂的PL SQL程序中执行ROLLBACK语句的位置(如果您只需修改现有代码)。如果您不使用“保存点到”ROLLBACK
将回滚到enter point(在您的示例中是第一次更新
,因为您的事务是从第一次更新
)开始的,回滚
之后,如果您使用的是一些DML
(在您的示例中是第三次更新
),则最后的“提交”将是仅提交事务的最后一部分(在上次回滚部分之后,第三次更新
)
关于这一评论: 但在某些情况下,很难确定ROLLBACK语句在复杂的PL SQL程序中的执行位置(如果您只需要修改现有代码) 如果您正在运行Oracle Database 12c Release 2实例(现在可从OTN、Github和Docker或多个云服务下载),那么您可以利用PL/Scope查找代码中执行提交和回滚的所有位置(PL/Scope是在11.1中首次添加的,但SQL语句分析是在12.2中添加的): 您必须首先启用范围数据的收集:
ALTER SESSION SET plscope_settings='identifiers:all, statements:all'
然后,当您编译程序单元时,信息被放入所有的_标识符(PL/SQL语句)和所有的_语句(SQL语句,12.2新增)
完成此操作后,以下查询将定位所有提交和回滚:
SELECT st.owner,
st.object_name,
st.object_type,
st.line,
src.text
FROM all_statements st, all_source src
WHERE st.TYPE = 'COMMIT'
AND st.object_name = src.name
AND st.owner = src.owner
AND st.line = src.line
ORDER BY st.owner,
st.object_name,
st.object_type
/
SELECT st.owner,
st.object_name,
st.object_type,
st.line,
src.text
FROM all_statements st, all_source src
WHERE st.TYPE = 'ROLLBACK'
AND st.object_name = src.name
AND st.owner = src.owner
AND st.line = src.line
ORDER BY st.owner,
st.object_name,
st.object_type
/
您可以找到有关PL/Scope的更多信息和示例。“如果省略savepoint子句,ROLLBACK语句将回滚整个事务”
ROLLBACK
将撤消所有操作,直到最后一次COMMIT
。您始终可以跟踪会话并找到回滚点(XCTREND rlbk=1)但如果您在plsql块中调用未提交的进程/包,这可能会变得复杂。@Tenzin,前提是您只调用了DML。每个DDL都会自动提交。@WernfriedDomscheit-Tenzin所说的100%正确,但可能过于简洁。您添加的内容很有价值,但与Tenzin所说的内容并不矛盾。自动提交
显然是一种提交。
SELECT st.owner,
st.object_name,
st.object_type,
st.line,
src.text
FROM all_statements st, all_source src
WHERE st.TYPE = 'COMMIT'
AND st.object_name = src.name
AND st.owner = src.owner
AND st.line = src.line
ORDER BY st.owner,
st.object_name,
st.object_type
/
SELECT st.owner,
st.object_name,
st.object_type,
st.line,
src.text
FROM all_statements st, all_source src
WHERE st.TYPE = 'ROLLBACK'
AND st.object_name = src.name
AND st.owner = src.owner
AND st.line = src.line
ORDER BY st.owner,
st.object_name,
st.object_type
/