Oracle处理数据(DML+DDL+DCL)+事务
SQL> /*
SQL> SQL语句
SQL> 1. DML语句(Data Manipulation Language 数据操作语言): insert update delete select
SQL> 2. DDL语句(Data Definition Language 数据定义语言): create/alter/drop/truncate table
SQL> create/drop view,create/drop index(sequence,synonym)
SQL> 3. DCL语句(Data Control Language 数据控制语言): commit rollback
SQL> */
SQL> --插入insert
SQL> --插入新员工
SQL> insert into emp(empno,ename,sal,deptno)
2 values(1001,'Tom',1000,10);
SQL> --隐式插入null值、显式插入空值
SQL> --地址符 &
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno);
输入 empno 的值: 1003
输入 ename 的值: 'Mike'
输入 sal 的值: 3000
输入 deptno 的值: 20
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,&ename,&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1003,'Mike',3000,20)
已创建 1 行。
SQL> insert into emp(empno,ename,sal,deptno) values(&empno,'&ename',&sal,&deptno)
2 ;
输入 empno 的值: 1005
输入 ename 的值: fakfj
输入 sal 的值: 3000
输入 deptno 的值: 10
原值 1: insert into emp(empno,ename,sal,deptno) values(&empno,'&ename',&sal,&deptno)
新值 1: insert into emp(empno,ename,sal,deptno) values(1005,'fakfj',3000,10)
已创建 1 行。
SQL>--&就相当于prepareStatemment 而且为了不出错 字符串需要加上''尽量加在预编译时期
SQL> rollback;
SQL> --在DML语句中使用地址符
SQL> select empno,ename,&a
2 from emp;
输入 a 的值: sal
SQL> select * from &a;
输入 a 的值: dept
SQL> --一次插入(拷贝)一批数据
SQL> create table emp20 as select * from emp where 1=2;
表已创建。
SQL> desc emp20
名称 是否为空? 类型
----------------------------------------------------------------------------------- -------- --------------------------------------------------------
EMPNO NUMBER(4)
ENAME VARCHAR2(10)
JOB VARCHAR2(9)
MGR NUMBER(4)
HIREDATE DATE
SAL NUMBER(7,2)
COMM NUMBER(7,2)
DEPTNO NUMBER(2)
SQL> select * from emp20;
未选定行
SQL> --一次性将emp中所有20号部门的员工插入到emp20
SQL> insert into emp20
2 select * from emp where deptno=20;
已创建5行。
SQL> truncate table emp20;
表被截断。
SQL> select * from emp20;
未选定行
SQL> --等同于: delete from emp20;
SQL> /*
SQL> delete和truncate table的区别
SQL> 1. delete是DML,truncate是DDL (DML可以rollback,DDL不可以)
SQL> 2. delete逐条删除;truncate先摧毁,再重建
SQL> 3. delet会产生碎片;truncate不会
SQL> 4. delete不会释放空间;truncate会
SQl> 5. 但是在Oracle中delete内部做了很多优化 所以一般是delete性能好
SQL> */
SQL> set feedback off
SQL>--关闭系统提示多少行收到影响
事务
SQL> /*
SQL> Oracle中的事务
SQL> 1. 事务的起始标志: DML语句
SQL> 2. 事务的结束标志: 提交: 显式提交 commit
SQL> 隐式提交 DDL 语句,正常退出 exit
SQL> 回滚: 显式 rollback
SQL> 隐式 非正常退出,掉电,宕机
SQL> */
SQL> --保存点
SQL> create table testsavepoint
2 (tid number,tname varchar2(20));
SQL> set feedback on
SQL> insert into testsavepoint values(1,'Tom');
已创建 1 行。
SQL> insert into testsavepoint values(2,'Mary');
已创建 1 行。
SQL> --定义保存点
SQL> savepoint a;
保存点已创建。
SQL> insert into testsavepoint values(3,'Moke');
已创建 1 行。
SQL> rollback to savepoint a;
回退已完成。
SQL> select * from testsavepoint;
TID TNAME
---------- --------------------
1 Tom
2 Mary
已选择2行。
SQL> commit;
提交完成。
事务的隔离级别
MySQL支持SQL99的四个 Oracle只支持2个 READ COMMITED 和Serializable 还支持另外一个不属于SQL99的规范 READ ONLY