好久没有来到这里了,没有什么心思写东西了,因为说真的现在学的却不知道怎么去描述,自己随便写写,下面开始进入正题.
在初级的时候没有涉及到数据库编程,只是简单的Java中传送一个sql语句到数据库,然后返回查询的结果在进行判断,说实话没有觉得有什么不对的,当然了,也看到过一些关于软件性能一些方面的东西,但是限于个人知识面的原因,那时候还没有仔细考虑,知道最近开始学习了数据库变成之后,才发现还有很大的提升,当然了,即便是现在这样,肯定还会有提升空间的,毕竟是新人么。
先简单的说一下效率的问题,个人理解,先说一下初级的时候执行数据库的增删改查的时候都要传送一个sql语句,然后进入数据库之后执行,但是当大量的数据发生的时候,每一个都要发送一个sql语句的话就会造成资源的浪费。而过程呢就是将过程存储到数据库中,在Java中只要传一个对象过去,调用对应的方法,然后取到返回值,这样在效率上面就有了一定的提升了。
简单的过程语法是
CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_list)] {IS|AS} [local_declarations] BEGIN executable_statements [EXCEPTION exception_handlers] END [procedure_name];
create or replace procedure proc_getEnameById(var_empno in number) as --在过程内部,变量直接定义,不需显示编写declare var_ename varchar2(50); begin select ename into var_ename from emp where emp.empno=var_empno; dbms_output.put_line('员工姓名为:'||var_ename); end;
过程现阶段就接触过很简单的一些,毕竟现在还在学习中,没有接触过太多
我现阶段用到最多的应该就是增删改查了。
1.添加用户的代码,以自己新建的userinfo表为标准,其中有userid,username,userpwd三个属性,另外创建了一个序列,seq_userinfo
create or replace procedure proc_addUser (var_username in varchar2,var_userpwd in varchar2,var_count out number) as begin insert into userinfo values(seq_userinfo.nextval,var_username,var_userpwd); var_count:=1; exception when others then var_count:=0; end;
而调用呢分为Java中和数据库中调用了
在oracle中的调用
--ORACLE中调用 declare var_username varchar2(50):='李四'; var_userpwd varchar2(50):='ls123'; var_count number; begin proc_addUser(var_username,var_userpwd,var_count); dbms_output.put_line(var_count); end;
在Java中调用
String sql="{call proc_addUser(?,?,?)}"; con=DBUtil.getConnetion();//这个可以就是连接的,只是封装到一个类中了 CallableStatement cstm =con.prepareCall(sql); //设置过程的参数 in,in ,out //注意下标 1 2 3 //out参数注册 index,Types(sql) cstm.registerOutParameter(3, Types.INTEGER); cstm.setString(1, "李四"); cstm.setString(2, "ls123"); //执行 cstm.execute(); //显示结果 int count=cstm.getInt(3); if(count==1){ System.out.println("添加用户"); } else{ System.out.println("用户不合法"); }
增删改,个人认为还是一样的,只是在过程当众有那么一个sql语句是不一样的,其他方面应该没有太大的区别,下面应该就是最麻烦的查了。
在查询的时候用到了游标,
create or replace procedure proc_emp(cur_emp out sys_refcursor) is begin open cur_emp for select * from emp; end;
在oracle中调用
declare cur_temp sys_refcursor; var_emprow emp%rowtype; begin proc_emp(cur_temp); --这样这个游标就有值了 fetch cur_temp into var_emprow; while cur_temp%found loop dbms_output.put_line(var_emprow.empno||var_emprow.ename); fetch cur_temp into var_emprow; end loop;--由于可能不是一个值,所以要循环的 end;
Java当众调用
String sql = "{call proc_emp(?)} "; // 调用DBUtil 数据访问类的方法 Connection con = DBUtil.getConnetion(); CallableStatement cstm =con.prepareCall(sql); cstm.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); cstm.execute(); ResultSet rs = (ResultSet)cstm.getObject(1); while(rs.next()){ System.out.println(rs.getString(1)+rs.getString(2)+rs.getString(3));}
--1完成用户信息表的所有信息查询
--2完成根据用户姓名模糊查询返回结果集过程
大体上就这些,其实还有其他的等一下在写写