我正在学习数据库。我在Windows中安装了Oracle 12c。然后我创建了一些表,我已经读取了表值并完成了一些基本操作。我创建了大约12个表。现在我的问题是,如果我正在创建任何新表,那么它表明该表已成功创建。并且数据的插入正在发挥作用。现在,如果我从sqlplus创建和插入数据,在SqlDevelopper和netbeans IDE中它只显示表名但没有数据,有时甚至不显示表名,尽管我已刷新。关闭sqlplus并在我尝试检索数据后再次打开它时,它显示没有选择任何行。但是sql中的describe命令显示存在一个表。
如果我在SQL-Developper中创建一个新表并在那里插入数据,在重新启动SQLDevelopper之后,它只显示表名但没有数据。并且表没有显示在netbeans或SQlPlus中。
请有人告诉我如何解决这个问题。
答案 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
出来,然后会自动提交。但是不要这样做,这是一种不好的做法。