【问题标题】:why oracle database not storing table values?为什么 oracle 数据库不存储表值?
【发布时间】:2016-06-22 05:03:22
【问题描述】:

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

如果我在 SQL-Developer 中创建一个新表并在其中插入数据,在重新启动 SQLDeveloper 后,它只显示表名但没有数据。并且该表未显示在 netbeans 或 SQlPlus 中。

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

【问题讨论】:

  • 让我猜猜……你开始了一个事务却从不提交?
  • 抱歉“提交”是什么?
  • 你需要一些关于transactions的基础知识
  • 好吧,给我投反对票,但至少告诉我如何解决这个问题..
  • 为了告诉你你做错了什么,我们需要你的代码,而不是对你的工具的模糊描述。但如果你不知道什么是事务,我建议你先找一本关于基本 SQL 的书或教程。

标签: database oracle netbeans oracle-sqldeveloper sqlplus


【解决方案1】:

由于您不了解 Transaction,因此目前作为解决方案,只需在完成插入后键入“commit”命令即可。并对“交易”做一些研究。希望这对您有所帮助。

详情如下:

首先什么是交易?

回答:

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

很明显,要么贷记和借记要么都发生,要么都不发生,这一点很重要。也就是说,资金转移必须全部发生或根本不发生。这种全有或全无的要求称为原子性。

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

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

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

程序员有责任正确定义各种事务,以便每个事务都保持数据库的一致性。例如,将资金从 A 部门账户转移到 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 命令将自上次 COMMIT 或 ROLLBACK 命令以来的所有事务保存到数据库。

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

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

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;

例子:

考虑具有以下记录的 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 |
+----+----------+-----+-----------+----------+

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

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.

现在三个删除操作已经发生,假设您改变了主意并决定回滚到您确定为 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命令而只需输入exit从@出来987654341@,然后它会自动提交。但不要这样做,这是一种不好的做法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    • 2013-09-29
    • 1970-01-01
    • 2020-02-09
    • 2021-11-01
    • 2010-10-06
    相关资源
    最近更新 更多