INSERT INTO emp(empno,ename,job,hiredate) VALUES(1234,’JOHN’,’CLERK’,’01-3月-86’); ? 使用特定格式插入日期值
INSERT INTO emp(empno,ename,job hiredate) VALUES(1356,’MARY’,’CLERK’,
to_date(‘1983-10-20’,’YYYY-MM-DD’)); ? 使用DEFAULT提供数据
INSERT INTO dept VALUES(60,’MARKET’,DEFAULT); 2. 使用子查询插入数据
INSERT INTO [(column[,column,?])] subQuery ? 使用子查询插入数据
INSERT INTO employee(empno,ename,sal,deptno) SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20;
? 使用子查询执行直接装载
INSERT /*+APPEND*/ INTO employee (empno,ename,sal,deptno) SELECT empno,ename,sal,deptno FROM emp WHERE deptno=20;
说明:尽管以上两种语句执行结果一样,但第二条语句使用/*+APPEND*/表示采用直接装载方式,当装载大批量数据时,采用第二种方法装载数据的速度要远远优于第一种方法。
8.2 更新数据
当更新表行的数据时,可以使用UPDATE语句。当使用UPDATE语句时,既可以使用表达式更新列值,也可以使用子查询更新一列或多列的数据,但使用UPDATE语句有以下注意事项:
? 如果要更新数字列,则可以直接提供数据值;如果要更新字符列或日期列,则数据必须用单引号引
住。
? 当更新数据时,数据必须要满足约束规则 ? 当更新数据时,数据必须与列的数据类型匹配
1. 使用表达式更新数据
36
语法:UPDATE
SET
UPDATE emp SET sal=2460 WHERE ename=‘SCOTT’; ? 更新多列数据
UPDATE emp SET sal=sal*1.1,comm.=sal*0.1 WHERE deptno=20; ? 更新日期列数据
UPDATE emp SET hiredate=TO_DATE(‘1984/01/01’,’YYYY/MM/DD’) WHERE empno=7788;
? 使用DEFAULT选项更新数据
UPDATE emp SET job=DEFAULT WHERE ename=‘SCOTT’; ? 更新违反约束规则的数据
UPDATE emp SET deptno=55 WHERE empno=7788;ERROR,未找到父项关键字 2. 使用子查询更新数据
当使用UPDATE语句更新数据时,某些情况下,使用子查询执行效率更好。 ? 更新关联数据
当更新关联数据时,使用子查询可以降低网络开销(简化SQL语句个数)。 UPDATE emp SET (job,sal,comm)=
(SELECT job,sal,comm. FROM emp WHERE ename=‘SMITH’)**** WHERE ename=‘SCOTT’; ? 复制表数据
当使用触发器复制表数据时,如果表A的数据被修改,那么表B的数据也应该修改。通过使用子查 询,可以基于一张表修改另一张表的数据。
UPDATE employee SET deptno=
(SELECT deptno FROM emp WHERE empno=7788); WHERE job=(SELECT job FROM emp WHERE empno=7788);
37
8.3 删除数据
使用DELETE语句可删除一行或多行数据,语法如下: DELETE FROM [WHERE
DELETE FROM emp WHERE ename=‘SMITH’; ? 删除表的所有数据 DELETE FROM emp;
? 使用TRUNCATE TABLE截断表
TRUNCATE TABLE emp,它不仅可删除表的所以数据,还会释放表段所占用的空间。通常删除大表的时 候使用该命令,另外一种情况,当需要连表删除的时候,如果数据量过大,可以先TRUNCATE,然后drop表
? 使用子查询删除数据
DELETE FROM emp WHERE deptno=(SELECT deptno FROM dept WHERE dname=‘SALES’); Delete from emp where (not) exists (?) ? 删除主表数据的注意事项
当删除主表数据时,必须确保从表不存在相关记录,否则会显示错误信息。 日期类型数据处理:
客户端是中文环境,月份不能用英文的月份写法,必须用中文的“六月”
如果不想修改sql语句运行的话,就需要在执行该语句之前,使用alter session 命令将nls_date_language修改为american,如下:
alter session set nls_date_language=‘american’ --以英语显示日期或 alter session set nls_date_language=‘simplified chinese’
alter session set nls_date_format=‘yyyy-mm-dd’;
38
9 使用事务
9.1 概述
在RDBMS中,数据的变化必须同时在所有相关的表中得到反映。如果一个表中的数据改变了,而这一变化没有在相关的表中反映出来,那么这将导致数据库里数据的不一致。如银行转帐。因此,数据的改变必须要么在相关的表中同时得到反映,要么不在任何表中得到反映。Oracle使用事务确保数据的一致性。 事务可定义为把一串一起执行的操作作为单个逻辑工作单元处理。单个工作单元必须具有四个属性,即:原子性、一致性、隔离性和持久性。
? 原子性:指所有的数据修改,要么全部执行,要么一个也不执行。
? 一致性:指通过事务进行的所有数据数据修改的状态必须同时在所有相关的表中得到反映。有关关系
型数据库中的数据完整性的所有规则,必须应用到事务修改中以维护数据完整性。
? 隔离性:是指事务应在另一个事务的修改过程开始前对数据进行访问,或者等另一个事务修改完数据
后再访问。处于修改之中的数据是不可被访问的。因此,事务不能在另一个事务修改数据时访问数据的中间状态
? 持久性:持久性保证事务对数据所做的变动是持久的。即使系统发生故障,数据中变动也不会丢失。
使用事务修改数据库的优点: ? 它保证了数据的一致性。
? 使用事务时,数据修改更灵活而且修改过程是可控的。
? 即使在用户处理失败或者系统发生故障的情况下,数据仍然是安全的。 ? 事务保证DML(数据操纵语言)语句对数据所做的变动是一致的。
9.2 事务分类
? 显式事务
显式事务指必须对所做的数据修改明确地表示接受或丢弃。显式事务又称为用户定义事务。为了接受显式事务对数据所做的修改,我们需要用到提交(COMMIT)语句。
提交语句:
完成显式事务。它结束当前事务,并使所有的修改持久有效。COMMIT语句允许用户查看其他用户对数据所做的修改。
在Oracle里,COMMIT语句写在事务的最后。COMMIT语句执行前的数据操作不是持久有效的,因为保存的数据库在缓冲区里。即使当前用户能看到数据的变动,但其他用户看不到这种变化。Oracle服务器默认在行级上锁,这意味着当一个用户正在修改数据时,其他用户不可能操纵被锁定行中数据。只执行COMMIT语句后数据才是永久地存储在数据库中。数据一旦被提交,以前的数据就彻底消失了。
COMMIT语句使你能: ? 保证数据的一致性
? 可在永久地更新数据前预览修改 ? 将逻辑相关的所有操作组合起来 语法: SQL statement1;
39
SQL statement2; COMMIT;
其中,COMMIT保证statement1和statement2所做的修改持久有效。 ? 隐式事务
隐式事务是自动地提交数据变动的系统事务。使用AUTOCOMMIT语句可实现隐式事务。AUTOCOMMIT语句可设置为ON或OFF。只有当AUTOCOMMIT被设置为ON时,数据修改才是持久有效的。如果AUTOCOMMIT被设置为OFF,必须显式地提交对数据所做的修改。按缺省方式,AUTOCOMMIT被设置为OFF。验证AUTOCOMMIT状态的语法如下:
SHOW AUTOCOMMIT
当AUTOCOMMIT被禁用时,结果返回“autocommit OFF”;反之,结果返回“autocommit IMMEDIATE”。 设想这样一种情况:你执行了两条DDL语句,而AUTOCOMMIT的状态为OFF。这时,你必须显式地提交该语句对数据库所做的修改。
语法:
SET AUTOCOMMIT ON
该语句将启用AUTOCOMMIT。这可通过说明SHOW AUTOCOMMIT语句来验证。
也可以执行一定个数的语句之后,设置AUTOCOMMIT以提交数据库中的变动。为此,必须指明提交数据库中的变动的语句个数。语法如下:
SET AUTOCOMMIT value
其中,value:确定提交修改前执行的语句个数。 如:
UPDATE Employee Set cCurrentPosition=‘0001’ WHERE cEmployeeCode=‘000006’;
Update Position Set nCurrentStrength=nCurrentStrength+1 WHERE cPositionCode=‘0001’;
UPDATE Positon Set nCurrentStrength=cCurrentStrength-1 WHERE cPositionCode=‘0016’;
在AUTOCOMMIT为OFF情况下,当出现以下情况时会自动提交事务:
? 当使用DDL语句时会自动提交事务,例如 CREATE TABLE、ALTER TABLE、DROP TABLE等语句 ? 当执行DCL语句(GRANT、REVOKE)时会自动提交事务
? 当正常退出SQL*Plus时(quit或exit)会自动提交事务。
9.3 回复修改
回滚事务
有时,可能在修改了表中数据后发现:所做的修改是无关紧要的或不正确的。也可能要按照你的要求进行修改。在这种情况下,需要回复所做的修改。回复修改时,可使用ROLLBACK语句。ROLLBACK语句终止当前事务,使数据库返回到以前的状态。
当在表中作出变动时,如果没有指定COMMIT语句,那么此变动只是存储在数据库缓冲区里。当说明ROLLBACK语句时,将丢弃缓冲区里的数据。然而,如果说明了COMMIT语句,那么数据将在各自的表里更新。说明了COMMIT语句后,ROLLBACK语句不会丢弃修改了。
使用ROLLBACK语句时:
? 自上一个COMMIT语句执行以来的所有数据修改都被取消。 ? 进行数据修改的行上的锁被解开。 使用ROLLBACK语句的优点有:
40