关闭

韩顺平oracle视频笔记四

341人阅读 评论(0) 收藏 举报

事务用于保证数据的一致性,要么全部成功,要么全部失败,它由一组相关的DML语句组成(银行自动取款机操作)

oracle会在被作用表上添加锁,防止其它用户改表的结构。


savepoint a1;
delete from emp where ename='SMTITH';
select * from emp;
savepoint a2;
delete from emp where ename='SCOTT';
select * from emp;
rollback to a2;
select * from emp;
rollback to a1;
select * from emp;
备注:这里不能使用commit命令,否则之前所用的savepoint都将全部不起作用了

 

 

只读事务
只允许执行查询操作,不允许其它的DML操作事务,使用只读事务可以确保用户只能读取某时间点的数据,之后的数据将不会理睬。
例如机票代售点每天18点开始统计今天的销售情况,但是18点肯定还有人在操作数据库,因此这里使用只读事务之后就不会对统计造成影响
实验:
1、打开PLSQL工具输入:
set transaction read only;
select * from emp;
2、打开另一个PLSQL工具
insert into emp values(....);
select * from emp;
3、操作第一个打开的PLSQL工具,执行全部查询
select * from emp;
结果:发现第一个查询的数量和第二个PLSQL查询的数量是不一致的,这就是设置只读事务的功能
设置只读事务之后,将不会显示当前时间点之后的所有操作数据

 

ORACLE函数学习
字符函数
lower(char)转换为小写格式
SQL> select lower(job) from scott.emp ;
upper(char)转换为大写格式
SQL> select upper(job) from scott.emp ;
length(char)字符串的长度
SQL> select length(job) from scott.emp ;
select * from scott.emp where length(ename)=5;
substr(char,m,n)取字符串的子串
select substr(ename,2,3) from scott.emp;
备注:查询ename是从第2个字母开始取,长度为个字符

以首字母大写的方式显示所有员工的姓名?
SQL> select upper(substr(ename,1,1))||lower(substr(ename,2,(length(ename)-1))) from scott.emp;

replace(char1,search_string,replace_string)
显示所有员工的姓名,用“我是A”替换“A”
select replace(ename,'A','我是大A') from scott.emp;

数学函数
round(n,[m])用户执行四舍五入
n表示要被作用的数据
m表示保留小数位
trunc(55.66,1)==55.7

trunc(n,[m])用于截取数字
n表示要被作用的数据
m表示保留小数位
trunc(55.66,1)==55.6
trunc(55.66,-1)==50
trunc(55.66)==55

mod(m,n)取模

floor(n)小于或者等于n的最大整数
ceil(n)大于或者是等于n的最小整数


查询已经入职超过300个月的员工信息
SQL> select * from scott.emp where sysdate>add_months(scott.emp.hiredate,300);
备注:sysdate为当前日期
add_months(scott.emp.hiredate,300)表示hiredate加上300个月

SQL> select sysdate-scott.emp.hiredate  from scott.emp;

package hb.com;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class TestTrans {

	public static void main(String[] args) {
		Connection conn = null;
		Statement stmt = null;
		try {
			DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
			System.out.println("driver is ok");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","system","admin");
			//不让oracle自动提交,而是手动提交数据
			conn.setAutoCommit(false);
			System.out.println("connection is ok");
			stmt = conn.createStatement();
			String sql1 = "update scott.emp set sal=sal-100 where ename='SMITH'";
			String sql2 = "update scott.emp set sal=sal-100 where ename='SCOTT'";
			stmt.execute(sql1);
			//这段代码是模拟操作出现异常的方法
			int a = 1/0;
			stmt.execute(sql2);
			//执行完上面两个SQL语句之后才commit
			conn.commit();
		} catch (SQLException e) {
			try {
			//如果出现异常将操作回滚,这样就能保证数据的一致性
				conn.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
		
		if(stmt!=null){
			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		if(conn!=null){
			try {
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

 

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:282357次
    • 积分:8455
    • 等级:
    • 排名:第2300名
    • 原创:1096篇
    • 转载:14篇
    • 译文:0篇
    • 评论:4条
    最新评论