为什么 oracle 数据库不存储 table 值?

why oracle database not storing table values?

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

如果我在 SQL-Developper 中创建一个新的 table 并在那里插入数据,在重新启动 SQLDevelopper 后,它只显示 table名称但没有 data.And table 未显示在 netbeans 或 SQlPlus 中。

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

由于您不了解事务,目前作为解决方案,只需在完成插入后键入 "commit" 命令即可。并在 "Transaction" 上做一些研究。希望这对你有帮助。

详情如下:

首先什么是交易?

答案:

通常,对数据库的多个操作形成一个逻辑工作单元。一个 例子是基金 transfer.Let 考虑一所有很多系的大学。每个部门都有资金,现在你想把一个部门的资金转移到另一个部门,其中一个部门账户(比如A)被借方,另一个部门账户(比如B)被记入贷方。

很明显,贷方和借方要么同时发生,要么两者都不发生。也就是说,资金转移必须全部发生或根本不发生。这个 all-or-none 要求被称为 atomicity.

此外,资金转移的执行必须保持数据库的一致性。也就是说,必须保留 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 一起使用。在创建 table 或删除它们时不能使用它们,因为这些操作会自动提交到数据库中。

COMMIT 命令:

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

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

COMMIT 命令的语法如下:

COMMIT;

示例:

考虑 CUSTOMERS table 具有以下记录:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

以下示例将从年龄 = 25 的 table 中删除记录,然后提交数据库中的更改。

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

因此,table 中的两行将被删除,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;

示例:

考虑 CUSTOMERS table 具有以下记录:

+----+----------+-----+-----------+----------+
| 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 |
+----+----------+-----+-----------+----------+

以下是示例,它将从 table 中删除年龄 = 25 的记录,然后回滚数据库中的更改。

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

因此,删除操作不会影响 table 并且 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_NAME;

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

回滚到保存点的语法如下:

ROLLBACK TO SAVEPOINT_NAME;

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

示例:

考虑 CUSTOMERS table 具有以下记录:

+----+----------+-----+-----------+----------+
| 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.

既然已经发生了三个删除,假设您改变了主意并决定回滚到您标识为 SP2 的保存点。因为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 命令用于删除您创建的保存点。

RELEASE SAVEPOINT 语法如下:

RELEASE SAVEPOINT SAVEPOINT_NAME;

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

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

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

SET TRANSACTION 的语法如下:

SET TRANSACTION [ READ WRITE | READ ONLY ];

所以现在如果想查看您从 net-beans 到 sql-plus 所做的更改,您可以使用 commit 命令,反之亦然。一件事是,在 sql-plus 中,如果您只是关闭 sqlplus window,那么它将自动回滚到其起始位置,如果不使用 commit命令,但只需键入 exitsqlplus 出来,然后它将自动提交。但是不要这样做,这是一种不好的做法。