为啥即使使用提交后 sql plus 也不会保存新行?

Posted

技术标签:

【中文标题】为啥即使使用提交后 sql plus 也不会保存新行?【英文标题】:Why would sql plus not save a new row even after using commit?为什么即使使用提交后 sql plus 也不会保存新行? 【发布时间】:2021-06-05 00:45:02 【问题描述】:

我正在为我的班级学习 DML,并尝试插入新行并使用 oracle 18c。即使在我使用 commit 命令后,该行也没有保存。在我关闭 sql plus 窗口并再次打开它并输入后

SELECT*FROM acctmanager;

它仍然显示No rows selected. 可能是什么问题?

[在此处输入图片描述]

【问题讨论】:

在关闭sql plus之前可以访问commit后的行吗? 请发一个完整的插入示例,一个接一个地选择。您当前的问题根本不清楚,这种情况是不可重现的(我无法想象这是可能的) 我可以在提交之后和关闭之前访问该行。 如果在同一个 SQLPlus 窗口中再次尝试连接会怎样;比如select * ...,然后是connect user/password@DB,然后又是select * ... 请为您的对象添加前缀,例如 'insert into .acctmanager ,select * from .acctmanager。您可能将对象“acctmanager”分散在多个架构/用户中。 【参考方案1】:

我敢打赌,ACCTMANAGER 是一个全局临时表。这些是永久性数据结构,但任何数据仅在事务或会话期间持续存在,具体取决于表的创建方式。 Find out more.

我可以在提交之后和关闭之前访问该行。

这强烈表明该表是使用 ON COMMIT PRESERVE ROWS 子句创建的。

很容易检查:

select table_name, temporary
from user_tables
where table_name = 'ACCTMANAGER'

【讨论】:

听起来可能是这样,但这是 oracle 可以自动执行的操作,因为我没有设置它来执行此操作。这是我要使用的脚本: CREATE TABLE acctmanager (amid CHAR(4), amfirst VARCHAR2(12) NOT NULL, amlast VARCHAR2(12) NOT NULL, amedate DATE DEFAULT SYSDATE, amsal NUMBER(8,2), amcomm NUMBER(7,2) 默认 0,区域 CHAR(2),CONSTRAINT acctmanager_amid_pk PRIMARY KEY (amid),CONSTRAINT acctmanager_region_ck CHECK (region IN ('N', 'NW', 'NE', 'S', 'SE', 'SW', 'W', 'E'))); 不,Oracle 不会自动将普通表转换为 GTT。所以,我们这里有一个谜题。您断言数据库正在做一些奇怪的事情。但我们只能反驳说您的数据库没有在做一些奇怪的事情。几十年来,由于丢失了已提交的事务,Oracle 一直不是领先的企业 RDBMS。您更有可能误解正在发生的事情;您忽略了环境或配置中的一些怪癖。很遗憾,我们无法为您提供更多帮助。 这很有可能,因为我对此很陌生。我很感激帮助。我也会继续学习。谢谢!

以上是关于为啥即使使用提交后 sql plus 也不会保存新行?的主要内容,如果未能解决你的问题,请参考以下文章

提交是成功的文本即使重新加载后也不会出现

为啥ios build即使成功也不会在试飞中显示

即使登录被拒绝,SQL*Plus 也会以 0 退出

为啥即使我们尝试获取数据而不是更新/提交新数据,GraphQL 也会查询 POST 请求?

为啥 Oracle Sql*Plus 打印许多不需要的标题?

即使安装后iOS应用程序也会崩溃,但新用户不会