//使用jdbc_odbc桥连接方式
public class TestOra {
public static void main(String[] args) {
try {
//1.加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.得到连接
Connection conn = DriverManager.getConnection("jdbc:odbc:testSLQ", "scott", "root123");
Statement stat = conn.createStatement();
ResultSet rs = stat.executeQuery("select * from emp");
while(rs.next()){
System.out.println("用户名:"+rs.getString(2));
}
//关闭打开的资源
rs.close();
stat.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
|
在oracle中操作数据-使用子查询插入数据
当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。
SQL>
insert into kkk (myid,myname,mydept) select empno,ename,deptno from emp where deptno = 10;
在oracle中操作数据-使用子查询更新数
据
使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据
希望员工scott的岗位、工资和补助与smith员工一样。
SQL>
update emp set (job,sal,comm) = (select job,sal,comm from emp where ename = 'SMITH') where ename = 'SCOTT';
Oracle中的事务处理
什么是事务?
事务是用于保证数据的一致性,它由一组相关的dml语句组成,该组的dml语句要么全部成功,要么全部失败。dml语句就是数据操作语言:包括数据的增加、删除和修改。
如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
当执行事务操作时(dml语句),oracle会在被作用的表上加锁,防止其他用户改变表的结构。这里对我们用户来讲是非常重要的。
事务和锁
提交事务
执行commit语句可以提交事务,当执行了commit语句后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务之后,其它会话将可以查看到当前事务变化后的新数据。
回退事务
在介绍回退事务前,我们先介绍一下保存点(savepoint)的概念和作用。保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的保存点。当执行rollback时,通过指定保存点可以回退到执行的点。
事务的几个重要操作
1)设置保存点 savepoint a
2)取消部分事务 rollback to a
3)取消全部事务 rollback
java程序中如何使用事务
在java操作数据库时,为了保证数据的一致性,比如转账操作(1)从一个账户减掉10$(2)在另一个账户上加入10$,我们看看如何使用事务。
public class TestTrans {
public static void main(String[] args) {
//事务案例
Connection conn = null;
try {
//1.加载驱动
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//2.得到连接
conn = DriverManager.getConnection("jdbc:odbc:testSLQ", "scott", "root123");
//加入事务处理
conn.setAutoCommit(false);
Statement stat = conn.createStatement();
//给scott的工资减100
stat.executeUpdate("update emp set sal = sal-100 where ename='SCOTT'");
int i = 7/0;
//给smith的工资加100
stat.executeUpdate("update emp set sal = sal+100 where ename='SMITH'");
//提交
conn.commit();
//关闭资源
stat.close();
conn.close();
} catch (Exception e) {
//如果发生异常,回滚
try {
conn.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
e.printStackTrace();
}
}
}
|
只读事务是指只允许执行查询的操作,而不允许执行任何其它dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,这时可以使用只读事务。在设置了只读事务后,尽管其它回话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
设置只读事务
set transaction read only
sql函数的使用---字符函数
字符函数是oracle中最常用的函数,我们来看看有哪些字符函数:
1.lower(char):将字符串转化为小写的格式
2.upper(char):将字符串转化为大写的格式
3.length(char):返回字符串的长度
4.substr(char,m,n):取字符串的字串 m代表从第几位取,n代表取几个。
5.replace(char1,search_string,replace_string)
将所有员工的名字按小写的方式显示?
SQL> select lower(ename) from emp;
将所有员工的名字按大写的方式显示?
SQL> select upper(ename) from emp;
显示正好为5个字符的员工的姓名?
SQL> select * from emp where length(ename)=5;
显示所有员工姓名的前三个字符?
SQL> select substr(ename,1,3) from emp;
以首字母大写的方式显示所有员工的姓名?
SQL> select upper(substr(ename,1,1))||lower(substr(ename,2)) from emp;
以首字母小写的方式显示所有员工的姓名?
SQL> select lower(substr(ename,1,1))||upper(substr(ename,2)) from emp;
显示所有员工的姓名,用"我是A"替换所有"A"
SQL> select replace(ename,'A','我是A') from emp;
数学函数
数学函数的输入参数和返回值的数据类型都是数字类型的。数学函数包括cos,cosh,exp,ln,log,sin,sinh,sqrt,tan,tanh,acos,asin,atan,round我们讲最常用的:
round(n,[m]) 该函数用于执行四舍五入,如果省掉m,则四舍五入到整数;如果m是正数,则四舍五入到小数点的m位后。如果m是负数,则四舍五入到小数点的m为前。
trunc(n,[m])
该函数用于截取数字。如果省掉m,就截去小数部分,如果m是正数就截取到小数点的m位后,如果m是负数,则截取到小数点的前m位。
mod(m,n) 该函数用于取模(取余)
floor(n) 返回小于或是等于n的最大整数
ceil(n) 返回大于或是等于n的最大整数
对数字的处理,在财务系统或银行系统中用的最多,不同的处理方法,对财务报表有不同的结果。
显示一个月为30天的所有员工的日工资数,忽略余数
SQL> select ename,sal,trunc(sal/30) day_sal from emp;
SQL> select ename,sal,floor(sal/30) day_sal from emp;
在做oracle测试的时候,可以使用dual表,是个虚拟表,一般用来做测试。
日期函数
日期函数用于处理date类型的数据
默认情况下日期格式是dd-mon-yy 即12-7月-78
(1)sysdate:该函数返回系统时间
(2)add_months(d,n):加月份的函数,n为加多少个月
(3)last_day(d):返回指定日期所在月份的最后一天
查找已经入职8个月多的员工?
SQL> select * from emp where sysdate > add_months(hiredate,8);
显示满10年服务年限的员工的姓名和受雇日期?
SQL> select * from emp where sysdate >= add_months(hiredate,120);
对于每个员工,显示其加入公司的天数?
SQL> select trunc(sysdate-hiredate) "入职天数",ename from emp;
找出各月倒数第三天受雇的所有员工?
SQL> select hiredate,ename from emp where hiredate = last_day(hiredate)-2;
转换函数
用yyyy-mm-dd hh24:mi:ss格式显示入职时间?
to_char
SQL> select ename,hiredate,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;
显示1980年入职的所有员工?
SQL> select * from emp where to_char(hiredate,'yyyy')=1980;
显示所有12月份入职的员工?
SQL> select * from emp where to_char(hiredate,'mm')=12;
系统函数
查询当前数据库名称
SQL> select sys_context('userenv','db_name') from dual;
查询当前数据库语言
SQL> select sys_context('userenv','language') from dual;
查询当前数据库用户
SQL> select sys_context('userenv','session_user') from dual;