为什么oracle数据库没有存储表值?

时间:2016-03-08 09:57:42

标签: database oracle netbeans oracle-sqldeveloper sqlplus

我正在学习数据库。我在Windows中安装了Oracle 12c。然后我创建了一些表,我已经读取了表值并完成了一些基本操作。我创建了大约12个表。现在我的问题是,如果我正在创建任何新表,那么它表明该表已成功创建。并且数据的插入正在发挥作用。现在,如果我从sqlplus创建和插入数据,在SqlDevelopper和netbeans IDE中它只显示表名但没有数据,有时甚至不显示表名,尽管我已刷新。关闭sqlplus并在我尝试检索数据后再次打开它时,它显示没有选择任何行。但是sql中的describe命令显示存在一个表。

如果我在SQL-Developper中创建一个新表并在那里插入数据,在重新启动SQLDevelopper之后,它只显示表名但没有数据。并且表没有显示在netbeans或SQlPlus中。

请有人告诉我如何解决这个问题。

1 个答案:

答案 0 :(得分:2)

由于您不了解交易,目前作为解决方案只需输入" commit"完成插入后的命令。并对" Transaction"做一些研究。希望这对你有帮助。

详情如下:

首先是什么是交易?

答案

通常,数据库上的多个操作构成一个逻辑工作单元。一个 例如资金转移。让我们考虑一个拥有多个部门的大学。每个离开都有资金,现在你想将一个部门的资金转移到另一个部门,其中一个部门账户(比如A)被借记,另一个部门账户(比如说B)被记入贷方。

显然,信用卡和借记卡都必须发生,或者两者都不发生。也就是说,资金转移必须完全发生或根本不发生。这种全有或全无的要求称为原子性。

此外,资金转移的执行必须保持数据库的一致性。也就是说,必须保留A和B的余额之和的值。此正确性要求称为一致性。

最后,成功执行资金转帐后,尽管可能出现系统故障,但帐户A和B的余额必须保持不变。此持久性要求称为持久性。

事务是执行单个逻辑的操作的集合 数据库应用程序中的函数。每笔交易都是原子性一致性的单位。因此,我们要求事务不违反任何数据库一致性约束。也就是说,如果数据库在事务启动时是一致的,则在事务成功终止时数据库必须保持一致。但是,在执行交易期间,可能需要暂时允许不一致,因为A的借方或B的贷方必须在另一方之前完成。这种暂时的不一致虽然是必要的,但如果发生故障可能会导致困难。

程序员有责任正确定义各种事务,以便每个事务都保持数据库的一致性。例如,将资金从部门A的账户转移到账户的交易 B部门可以定义为由两个独立的程序组成:一个 借记帐户A,另一个贷记帐户B.执行这些 两个程序一个接一个地确实保持一致性。但是,每一个 程序本身不会将数据库从一致状态转换为新状态 一致的状态。因此,这些程序不是交易。

确保原子性和耐久性属性是其责任 数据库系统本身 - 特别是恢复管理器。在缺少...之下 失败,所有事务成功完成,原子性很容易实现。 但是,由于各种类型的故障,事务可能无法始终成功完成其执行。如果我们要确保原子性属性,则失败的事务必须对数据库的状态没有影响。 因此,必须将数据库恢复到有问题的事务开始执行之前的状态。数据库系统必须首先形成故障恢复,即检测系统故障并将数据库恢复到故障发生之前存在的状态。

最后,当多个事务同时更新数据库时,即使每个单独的事务都是正确的,也可能不再保留数据的一致性。并发控制管理器负责控制并发事务之间的交互,以确保数据库的一致性。事务管理器由并发控制管理器和恢复管理器组成。事务的概念已广泛应用于数据库系统和应用程序中。虽然交易的初始使用是在金融应用中,但该概念现在用于电信的实时应用,以及产品设计或管理工作流程等长期活动的管理。

现在在SQL中进行交易:

交易控制:

以下命令用于控制交易:

COMMIT: to save the changes.

ROLLBACK: to rollback the changes.

SAVEPOINT: creates points within groups of transactions in which to ROLLBACK

SET TRANSACTION: Places a name on a transaction.

事务控制命令仅用于DML命令INSERT,UPDATE和DELETE。在创建表或删除它们时不能使用它们,因为这些操作会自动在数据库中提交。

COMMIT命令:

COMMIT命令是用于将事务调用的更改保存到数据库的事务命令。

自上次COMMIT或ROLLBACK命令以来,COMMIT命令将所有事务保存到数据库中。

COMMIT命令的语法如下:

COMMIT;

示例:

考虑具有以下记录的CUSTOMERS表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下示例将从age = 25的表中删除记录,然后在数据库中执行COMMIT更改。

SQL> DELETE FROM CUSTOMERS
     WHERE AGE = 25;
SQL> COMMIT;

因此,表中的两行将被删除,SELECT语句将产生以下结果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

ROLLBACK命令:

ROLLBACK命令是用于撤消尚未保存到数据库的事务的事务命令。

自上次发出COMMIT或ROLLBACK命令以来,ROLLBACK命令只能用于撤消事务。

ROLLBACK命令的语法如下:

ROLLBACK;

示例:

考虑具有以下记录的CUSTOMERS表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

以下是示例,该示例将从age = 25的表中删除记录,然后ROLLBACK数据库中的更改。

SQL> DELETE FROM CUSTOMERS
     WHERE AGE = 25;
SQL> ROLLBACK;

因此,删除操作不会影响表,SELECT语句将产生以下结果:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------

SAVEPOINT命令:

当您可以将事务回滚到某个点而不回滚整个事务时,SAVEPOINT是事务中的一个点。

SAVEPOINT命令的语法如下:

SAVEPOINT SAVEPOINT_NAME;

此命令仅用于在事务语句中创建SAVEPOINT。 ROLLBACK命令用于撤消一组事务。

回滚到SAVEPOINT的语法如下:

ROLLBACK TO SAVEPOINT_NAME;

以下是您计划从CUSTOMERS表中删除三个不同记录的示例。您希望在每次删除之前创建SAVEPOINT,以便您可以随时ROLLBACK到任何SAVEPOINT以将适当的数据返回到其原始状态:

示例:

考虑具有以下记录的CUSTOMERS表:

+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  1 | Ramesh   |  32 | Ahmedabad |  2000.00 |
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+

现在,这是一系列操作:

SQL> SAVEPOINT SP1;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=1;
1 row deleted.
SQL> SAVEPOINT SP2;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=2;
1 row deleted.
SQL> SAVEPOINT SP3;
Savepoint created.
SQL> DELETE FROM CUSTOMERS WHERE ID=3;
1 row deleted.

现在已经发生了三次删除,比如你已经改变主意并决定ROLLBACK到你确定为SP2的SAVEPOINT。由于SP2是在第一次删除后创建的,因此最后两次删除将被撤消:

SQL> ROLLBACK TO SP2;
Rollback complete.

请注意,自从您回滚到SP2后,只发生了第一次删除:

SQL> SELECT * FROM CUSTOMERS;
+----+----------+-----+-----------+----------+
| ID | NAME     | AGE | ADDRESS   | SALARY   |
+----+----------+-----+-----------+----------+
|  2 | Khilan   |  25 | Delhi     |  1500.00 |
|  3 | kaushik  |  23 | Kota      |  2000.00 |
|  4 | Chaitali |  25 | Mumbai    |  6500.00 |
|  5 | Hardik   |  27 | Bhopal    |  8500.00 |
|  6 | Komal    |  22 | MP        |  4500.00 |
|  7 | Muffy    |  24 | Indore    | 10000.00 |
+----+----------+-----+-----------+----------+
6 rows selected.

RELEASE SAVEPOINT命令:

RELEASE SAVEPOINT命令用于删除您创建的SAVEPOINT。

RELEASE SAVEPOINT的语法如下:

RELEASE SAVEPOINT SAVEPOINT_NAME;

一旦SAVEPOINT被释放,您就不能再使用ROLLBACK命令撤消自SAVEPOINT以来执行的事务。 SET TRANSACTION命令:

SET TRANSACTION命令可用于启动数据库事务。此命令用于指定后续事务的特征。

例如,您可以将事务指定为只读或读写。

SET TRANSACTION的语法如下:

SET TRANSACTION [ READ WRITE | READ ONLY ];

现在,如果想要查看从net-beans到sql-plus所做的更改,则可以使用commit命令,反之亦然。有一点是在sql-plus中,如果你只是关闭sqlplus窗口,那么它将自动回滚到它的起始位置,如果不使用commit命令,只需输入{{ 1}}从exit出来,然后会自动提交。但是不要这样做,这是一种不好的做法。