Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如果Rollback语句在不指定保存点的情况下调用呢_Sql_Oracle_Plsql - Fatal编程技术网

Sql 如果Rollback语句在不指定保存点的情况下调用呢

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)

我们可以在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) 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    
/