1、java程序操作oracle
java如何连接oracle:
try{ //演示如何使用jdbc-odbc桥连接方式来操作数据库 /*//1、加载驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //2、得到链接 Connection ct=DriverManager.getConnection("jdbc:odbc:OracleSource", "scott", "liujiyu"); //3、从下面开始和sql sever一样 Statement sm=ct.createStatement();//创建sql语句的statement类的实例 ResultSet rs=sm.executeQuery("select * from emp");*/ //使用jdbc方式连接数据库 //1、加载驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2、得到链接 Connection ct=DriverManager.getConnection("jdbc:oracle:thin:@192.168.2.144:1521:ORCL", "scott", "liujiyu"); //这里的IP地址、数据库实例名根据具体情况修改 //localhost表示安装oracle 的ip地址,1521表示oracle 的端口号,ORCL表示的是数据库实例名 //3、从下面开始和sql sever一样 Statement sm=ct.createStatement();//创建sql语句的statement类的实例 ResultSet rs=sm.executeQuery("select * from emp");//结构类似于一张数据表 while(rs.next()) { //显示查询的内容 System.out.println("用户名:"+rs.getString(2)+" "+"sal:"+rs.getFloat(6));//获取数据表当前行的指定列的值,用String表示 } //关闭资源 rs.close(); sm.close(); ct.close(); }catch(Exception e){ e.printStackTrace(); }
注意:需要加载oracle 自带的驱动包。
oracle 中使用哦to_date函数可以输入任意格式的日期。to_date('1988-12-12',yyyy-mm-dd),to_date('1988/12/12',yyyy/mm/dd)
2、oracle事物查询的概念
(1)使用子查询插入数据
当使用values子句时,一次只能插入一行数据,当使用子查询插入数据时,一条insert语句可以插入大量的数据。当处理行迁移或者装载外部表的数据到数据库时,可以使用子查询来插入数据。
insert into kkk(myID,myname,mydept) select empno,ename,deptno from emp where deptno=10;//将部门号为10的所有员工的信息加载到表kkk中。
(2)使用子查询更新数据
使用update语句更新数据时,既可以使用表达式或者数值直接修改数据,也可以使用子查询修改数据。
例如:如何使得员工scott的岗位、工资、补助与simth员工一样。//这就是用三个未知的数据去更新一条数据
update emp set (job,sal,comm)=(select job,sal,comm from emp where ename='SMITH') where ename ='SCOTT';
(3)oracle中的事务处理
事务用于保证数据的一致性,它有一组相关的dml语句组成,该组的(增、删、改)dml语句要么全部成功,要么全部失败。例如:网上转账就是典型的要用事务来处理,用以保证数据的一致性。
//测试oracle中的事务,即在java中操作oracle中的事务。 public class testtrans { public static void main(String[] args) { // TODO Auto-generated method stub Connection ct=null; try{ //加载oracle驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); //2、得到链接 ct=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL", "scott", "liujiyu"); //localhost表示安装oracle 的ip地址,1521表示oracle 的端口号,ORCL表示的是数据库实例名 //加入事务处理 ct.setAutoCommit(false);//设置它不能默认提交 ,这是事务开头需要设置的。 Statement sm=ct.createStatement();//创建sql语句类的实例 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(); }catch(Exception e){ //如果发生异常,就回滚 /*try{ ct.rollback(); }catch(Exception ex){ ex.printStackTrace(); }*/ e.printStackTrace(); } } }
(4)事务和锁
当执行事务操作(dml语句)时,oracle会在被作用的表上加锁,防止其他用户改表表的结构。这里对我们的用户来讲是非常重要的。
(5)提交事务,提交表示确认所有的事务都无误之后再提交的。如果不手动提交commit的话,退出时会自动提交。
当执行commit语句可以提交事务,当执行了commit语句之后,会确认事务的变化、结束事务、删除保存点、释放锁,当使用commit语句结束事务之后,其他会话将可以查看到事务变化后的新数据。
(6)回退事务,注意这个回退事务是在提交事务之前进行的。
在介绍回退事务之前,我们先介绍一下保存点(savepoint)的概念和作用,保存点是事务中的一点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点。当执行rollback时,通过指定保存点可以回退到指定的点。
因此,作为一个oracle管理员一般在早上上班的时候会创建一个保存点,中午的时候也创建一个保存点,晚上下班也创建一个保存点。若该管理员突然在某个时间点出现了一点问题,可以通过回退事务,回退到相应的保存点。
savepoint a1;//创建保存点。
rollback to a1;//回退到保存点
delete from emp where empno=9996;//删除一行数据
(7)在java程序中如何使用事务
在java操作数据库时,为了保证数据的一致性,比如转账操作:(1)从一个账户上减掉10元,(2)在另一个账户上加上10元。
update emp set sal=sal-100 where ename='SCOTT';//给scott用户的sal减去100
update emp set sal=sal+100 where ename='SIMTH';//给simth用户的sal加上100
(8)只读事务
只读事务是指只允许执行查询的操作,而不允许执行任何其他dml操作的事务,使用只读事务可以确保用户只能取得某时间点的数据。假定机票代售点每天18点开始统计今天的销售情况,
这时可以使用只读事务,在设置了只读事务后,尽管其它会话可能会提交新的事务,但是只读事务将不会取得最新数据的变化,从而可以保证取得特定时间点的数据信息。
//1、设置只读事务,不影响其他事务的操作,且看不到从设置只读事务那刻开始,新的操作产生的结果。即只读事务是查询当前点之前所有的内容,对当前点之后的所有内容不可见。
set transaction read only
//2、后面利用各种查询操作。
3、oracle各种sql函数
(1)字符函数
lower(char):将字符串转化为小写的格式
upper(char):将字符串转化为大写的格式
length(char):返回字符串的长度
substr(char,m,n):取字符串的字串,m表示字串从第几个字符开始,n表示取多少个字符即字串的字符数。
replace(char1,search_string,replace_string)
instr(char1,char2,[]):取字串在字符串的位置
如何使得所有员工的名字首字母大写。
//1、将首字母大写
select upper(substr(ename,1,1)) from emp;
//2、将后面的字符小写
select lower(substr(ename,2,length(ename))) from emp;
//3、合并两次结果
select upper(substr(ename,1,1))||lower(substr(ename,2,length(ename))) from emp;
(2)数学函数
round(n,[m]):用于执行四舍五入,如果省略m,则四舍五入到整数;如果m是正数,则四舍五入到小数点的后m位。如果m是负数,则四舍五入到小数点前m位
trunc(n,[m]):用于截取数字。如果省略m,就只截取整数部分,如果m是正数就截取到小数点后m位,如果m是负数,则截取到小数点的前m位。
mod(m,n)取模。select mod(10,2) from dual;//dual表示虚拟表,用于做测试。
floor(n)返回小于或等于n的最大整数
ceil(n)返回大于或等于n的最小整数
如何显示在一个月为30天的情况所有员工的日薪金,忽略余数。
select trunc(sal/30),ename from emp;
(3)日期函数
日期函数用于处理date类型的数据。默认情况下日期函数格式是dd-mon-yy,即12-7月-78
//1、sysdate:该函数返回系统当前时间:select sysdate from dual;
//2、add_months(d,n):对于某个字段d增加多少个月
//3、last_day(d):返回指定日期所在月份的最后一天
如何查找已经入职8个月多的员工?
select * from emp where sysdate>add_moths(hiredate,8);
如何显示满10年服务年限的员工的姓名和受雇日期?
select ename,hiredate from emp where sysdate>=add_moths(hiredate,12*10);
对于每个员工,如何显示器加入公司的天数?
select sysdate-hiredate from emp ;//sysdate-hiredate的差值是返回的是天数
如何找出各月倒数第三天受雇的所有员工?
select hiredate,ename from emp where last_day(hiredate)-2=hiredate;
(4)转换函数
转换函数用于将数据类型从一种转为另外一种类型,在某些情况下,oracle server允许值的数据类型和实际的不一样,这时oracle server会隐含的转化数据类型。
比如:create table t1(id int);
insert into t1 values('10')-->这样oracle会自动的将'10'转化为10.
create table t2(id varchar2(10));
insert into t2 values(1);//这样oracle就会自动的将1-->'1';
我们要说的是尽管oracle可以进行隐含的数据类型转换,但是他并不适应所有的情况,为了提高程序的可靠性,我们应该使用转换函数。
//1、to_char函数
yy:两位数字的年份
yyyy:四位数字的年份
mm:两位数字的月份
dd:两位数字的天
hh24:
hh12:
mi、ss显示分钟、秒
例如显示时间的时分秒
select ename ,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss') from emp;//这里需要注意的是,你在插入数据的时候闭关不是按照这种时间格式输入时,则查出的时间时分秒是00:00:00。
9:显示数字,并忽略前面0
0:显示数字,如位数不足,则用0补齐
.:在指定位置显示小数点
,:在指定位置显示逗号
$:在数字前加美元
L:在数字前加本地货币符号
C:在数字前加国际货币符号
G:在指定位置显示组分隔符
D:在指定位置显示小数点符号
例如在薪水前面加上本地的货币单位。
例如显示时间的时分秒
select ename ,to_char(hiredate,'yyyy-mm-dd hh24:mi:ss'),to_char(sal,'L99,999.99')from emp;//这里需要注意的是,你在插入数据的时候闭关不是按照这种时间格式输入时,则查出的时间时分秒是00:00:00。
//'L99999.99'中L表示本地的货币符号,99,999.99中9表示显示数字
例如显示1980年入职的所有员工:
select * from emp where to_char(hiredate,'yyyy')=1980;
显示12月份入职的所有员工:
select * from emp where to_char(hiredate,'mm')=12;
(5)系统函数
//1、sys_context函数
1)terminal:当前会话客户所对应的终端的标识符
2)language:语言
3)db_name:当前数据库名称
4)nls_date_format:当前会话客户所对应的日期格式
5)session_user:当前会话客户所对应的数据库用户名
6)current_schema:当前会话客户所对应的默认方案名
7)host:返回数据库所在主机的名称
通过sys_context函数可以查询一些重要信息,比如你在使用哪个数据库?
select sys_context('userenv','db_name') from dual;//参数'userenv'不变。
方案和用户的关系:
当你创建一个用户的时候,名叫aaa,那么oracle就会自动给你创建一个方案,方案名也叫aaa。方案当中有很多数据对象,比如表,视图,触发器,存储过程等。oracle是采用方案的形式来表示用户的,所有的数据都存放在方案当中。