暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 在SQL脚本中创建表-当更改可见时?

askTom 2018-08-05
154

问题描述

嗨,汤姆,
我有一个SQL脚本。因为我正在创建备份表,比如表A。之后,我将使用某些条件 (没有提交) 更新表A。之后,我正在创建另一个备份表,例如表B。之后,我用一些条件 (没有提交) 更新表B。所有这些条件都在我的SQL脚本中。

我的假设是,当您更新表时,更改将仅针对该特定会话可见 (与SQL脚本中发出的DDL语句无关)。只有当我们显式发布commit语句时,它才对其他会话可见。


我的同事语句是 (这有点令人困惑),如果我们使用DDL语句和更新语句再次在一个单一的SQL脚本中另一个DDL语句和更新语句,它将自动提交该特定会话。请让我知道哪个陈述是明确和正确的 (我的假设或我的同事假设

专家解答

你的同事是正确的。

DDL包括语句前后的隐式提交。所以如果你通过脚本创建一个表格,你已经发出了一个提交:

create table t1 (
  c1 int
);

insert into t1 values ( 1 );

create table t2 (
  c1 int
);

insert into t2 values ( 1 );

rollback;

select * from t1;

C1   
   1 

select * from t2;

no rows selected


这样其他人就可以查看您的更改。并且在创建它之前不能回滚到。

尽管18c确实为该规则带来了例外。私有临时表。您可以回滚到创建之前:

insert into t1 values ( 2 );

select * from t1;

C1   
   2 
   1 

create private temporary table ora$ptt_t (
  c1 int
);

insert into ora$ptt_t values ( 1 );

rollback;

select * from t1;

C1   
   1 


尽管回滚也会破坏您的PTT:

select * from ora$ptt_t;

SQL Error: ORA-00942: table or view does not exist


您需要设置on commit子句来保留定义以避免这种情况。但是无论您做什么,当您的会话结束时,PTT都消失了!
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论