使用简单的sql查询在表上进行DML操作后是否需要提交?

时间:2014-08-12 12:28:09

标签: sql oracle-sqldeveloper

在SQL Developer中进行DML操作后是否需要运行COMMIT命令?例如,我执行了以下UPDATE查询:

UPDATE TAB1 
SET TBX_TYP='ZX'
WHERE TBX_TYP IN(SELECT TBX_TYP
                  FROM(
                   SELECT DISTINCT TBX_TYP
                    FROM TAB1
                       ORDER BY 1 ) 
                 WHERE ROWNUM=1);

然后当我尝试过滤列时,我发现没有更新任何内容。

2 个答案:

答案 0 :(得分:2)

如果您希望更改可用于其他用户/连接,则需要COMMIT指令,例如:

SESSION1:

SQL> conn hr/hr
Connected.

SQL> truncate table ttt;

Table truncated.

SQL> desc ttt;
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 COL1                                      NOT NULL VARCHAR2(20 CHAR)

SQL> insert into ttt values('one');

1 row created.

SQL> select col1 from ttt;

COL1
--------------------
one

因此,当前会话中可以获得新数据。

会话2:

SQL> conn hr/hr
Connected.
SQL> select col1 from ttt;

no rows selected

但是另一个会话无法看到这些数据。所以让我们承诺:

SESSION1:

SQL> commit;

Commit complete.

会话2:

SQL> /

COL1
--------------------
one

现在这个值可用于两个会话。

但是也需要提交将数据存储在数据文件中。

例如,让我们在ttt表中添加一个新行,但不提交它:

SESSION1:

SQL> insert into ttt values('two');

1 row created.

SQL> select col1 from ttt;

COL1
--------------------
one
two

然后让我们异常关闭数据库并再次启动它

会话2:

SQL> conn / as sysdba
Connected.
SQL> shutdown abort
ORACLE instance shut down.
SQL> startup
ORACLE instance started.

Total System Global Area 1068937216 bytes
Fixed Size                  2260048 bytes
Variable Size             616563632 bytes
Database Buffers          444596224 bytes
Redo Buffers                5517312 bytes
Database mounted.
Database opened.
SQL>

然后重新连接Session1并查看ttt表:

SQL> conn hr/hr
Connected.
SQL> select col1 from ttt;

COL1
--------------------
one

如您所见,数据库不会在其数据文件中存储未提交的数据。

答案 1 :(得分:0)

在每个DML(更新,删除,插入)命令后添加提交。