oracle的事务
//小技巧
1 当使用value子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据
当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据
举例:insert into test values(myid,myname,mydept) select empno,ename,deptno from emp;
2 使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
举例:希望员工Scott的岗位、工资、补助与smith员工一样
update emp set (job,sal,comm)=(select job,sal,comm from emp where ename=’smith’) where ename=’scott’;
1 什么是事务
事务是用于保证数据的一致性,它由一组相关的dml(增、删、改)语句组成,要么该组dml语句全部成功,要么全部失败
当执行事务操作时,oracle会加上锁
2 提交事务(exit退出,自动提交)
当使用commit语句后,会确认事务的变化、结束事务、删除保存点,释放锁
3 回退事务(一定要保证没有commit)
保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动删除该事务所定义的所有保存点,当执行rollback时,通过指定保存点可以回退到指定的点
save point a1;
进行一系列操作,如删除
delete from emp where ename=”;
save point a2;
又进行一系列操作
取消部分事务rollback to a1; //取消全部事务:rollback
4 在Java程序中如何使用事务
转账:从一个账户减去10元,在另一个账户加上10元
//1.加载驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//2.得到链接
Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:myoral(IP地址+端口号+数据库实例)”,”scott”,”m123”);
//3
Statement sm==ct.createStatement();
//从Scott中减去100,在给smith加100
sm.executeUpdate(“update emp set sal=sal-100 where ename=’scott’”);
int i=7/0; 这样的话执行完第一句后,就执行不了加钱的操作了,会抛异常了,但前面减钱的操作却自己执行了
sm.executeUpdate(“update emp set sal=sal+100 where ename=’smith’”);
//关闭打开的资源
sm.close();
ct.close();
解决方案:加入事务处理
//1.加载驱动
Class.forName(“oracle.jdbc.driver.OracleDriver”);
//2.得到链接
Connection ct=DriverManager.getConnection(“jdbc:oracle:thin:@127.0.0.1:1521:myoral(IP地址+端口号+数据库实例)”,”scott”,”m123”);
//加入事务处理
ct.setAutoCommit(false); 这样的话不会执行一句话提交一句话,由自己控制提交时间,假如抛出异常,那么重新在抛异常的函数那添加回滚命令
//3
Statement sm==ct.createStatement();
//从Scott中减去100,在给smith加100
sm.executeUpdate(“update emp set sal=sal-100 where ename=’scott’”);
int i=7/0; 这样的话执行完第一句后,就执行不了加钱的操作了,会抛异常了,但前面减钱的操作却自己执行了
sm.executeUpdate(“update emp set sal=sal+100 where ename=’smith’”);
//提交事务
ct.commit();
//关闭打开的资源
sm.close();
ct.close();
5 只读事务
只读事务只 允许执行查询的操作,不能执行其他dml操作的事务
设置只读事务:set transaction read only
oracle的函数
1 字符函数
lower(chaer):将字符串转化为小写的格式
upper(char):将字符串转换为大写的格式
length(char):返回字符串的长度
substr(char,m,n):取字符串的子串 从m开始取,取n个字符
replace(char1,search_string,replace_string)
instr(char1,char2,[,n[,m]])取子串在字符串的位置
如:将所有员工的名字按小写的方式显示
sql>select lower(ename) from emp;
如:显示正好为5个字符的员工的姓名
sql>select ename from emp where length(ename)=5
如:显示所有员工的前三个字符
sql>select substr(ename,1,3) from emp;
如:以首字母大写的方式显示所有员工的