2016-03-08 81 views
-1

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

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

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

+1

让我猜...你开始一个交易,从不提交它? –

+0

抱歉,“提交”是什么? – Green

+1

你需要一些关于[交易]的基础知识(http://www.tutorialspoint.com/sql/sql-transactions.htm) – Aleksej

回答

1

由于您不了解事务,因此在此时作为解决方案,只需在完成插入后键入“commit”命令即可。并做一些关于“交易”的研究。希望这可以帮助你。

细节都给予如下:

首先是什么交易?

答:

通常情况下,数据库的几个操作形成一个工作逻辑单元。例如 是资金转移。让我们考虑一个有很多部门的大学。每个出发点都有资金,现在你想把一个部门的资金转移到另一个部门,其中一个部门账户(比如说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 | 
+----+----------+-----+-----------+----------+ 

以下是这将删除记录的例子从年龄= 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命令是事务性命令用于撤销尚未保存到数据库的事务。

ROLLBACK命令只能用于撤消自上次执行COMMIT或ROLLBACK命令后发生的事务。

为回滚命令的语法如下:

ROLLBACK; 

实施例:

考虑客户表具有以下记录:

+----+----------+-----+-----------+----------+ 
| 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的记录,然后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_NAME; 

该命令仅在创建事务语句中保存点的服务。 ROLLBACK命令用于撤消一组事务。

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

ROLLBACK TO SAVEPOINT_NAME; 

以下是您计划从CUSTOMERS表中删除三个不同履历的一例。你想创建一个保存点每个删除之前,这样就可以在任何时间,以适当的数据恢复到原来的状态回滚到任何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. 

现在,这三个缺失已经发生,说你有CH激怒了你的想法,并决定将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. 

释放SAVEPOINT命令:

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

为RELEASE SAVEPOINT的语法如下:

RELEASE SAVEPOINT SAVEPOINT_NAME; 

一旦保存点已被释放,就可以不再使用ROLLBACK命令撤消自SAVEPOINT进行交易。 SET TRANSACTION命令:

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

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

的SET TRANSACTION语法如下:

SET TRANSACTION [ READ WRITE | READ ONLY ]; 

所以,现在如果想看到你已经从净豆制成到SQL加的变化,你必须使用commit命令,反之亦然。有一件事是,如果你只是关闭了sqlplus窗口,那么它会自动回滚到其起始位置,如果不使用commit命令,但只需键入exitsqlplus出来,那么它会自动地承诺。但不要这样做,这是一个不好的做法。

相关问题