oracle存储过程一(返回单条记录的值)

来源:互联网 发布:淘宝软件 编辑:程序博客网 时间:2024/06/14 13:30

         最近在使用java验证excel表单元格的信息,数据量非常大,而且验证的规则比较复杂,如果单纯使用程序的验证的话,效率将非常低,考虑到oracle存储过程是可编译的,每次编译之后都会将数据放入高速缓存当中,下次再取,速度将非常的快。之前并没有接触到oracle的存储过程,所以也花了几天的时间去研究了一番,由于时间紧迫,没有怎么很好的整理。现在先将比较基本的一些实现方法给大家分享一下

        下面是使用java调用存储过程来返回out的值,因为存储过程有三种参数,in表输入,out表输出,in out即可输入又可输出,什么意思呢?刚接触的人可能就不大明白了,其实in就像java方法中的参数一样,可将参数传到存储过程(其实就将存储过程看成方法就行了,只是比较特殊,他是可编译的),而out相当于java方法的返回参数,只是存储过程可以定义多个out,相当于可以return多个参数一样,do you understand?

        需要注意的是,out可以返回单条记录或者多条记录,他们的实现方法是不一样的,返回单条记录直接将他作为某个变量赋值就行,下面随便写了一个例子说明一下:

存储过程代码:

create or replace procedure find_emp(e_id_i integer,id_o out integer, e_id_o out integer,name_o out varchar2,gender_o out char,borndate_o out date,hire_date_o out date,phone_o out number,e_mail_o out varchar2,zaizhi_o out integer,postname_o out varchar2,department_name_o out varchar2,velname_o out varchar2)as       --声明变量       vid integer;       ve_id integer;       vname varchar2(8);       vgender char(2);       vborndate date;       vhire_date date;       vphone number(11);       ve_mail varchar2(50);       vzaizhi integer;       vpostname varchar2(8);       vdepartment_name varchar2(8);       vvelname varchar2(8);       begin       --注意into的变量要与表中的字段一一对应       select e.id, e.e_id, e.name, e.gender, e.borndate, e.hire_date, e.phone, e.e_mail, e.zaizhi, p.postname, d.department_name, m.velname into vid,ve_id,vname,vgender,vborndate,vhire_date,vphone,ve_mail,vzaizhi,vpostname,vdepartment_name,vvelname from employees e left join post p on e.position=p.postid left join departments d on e.department_id=d.department_id left join managerlevel m on e.level_id=m.vel where e.e_id=e_id_i;       --把变量赋值给输出参数       id_o := vid;       e_id_o := ve_id;       name_o := vname;       gender_o := vgender;       borndate_o := vborndate;       hire_date_o := vhire_date;       phone_o := vphone;       e_mail_o := ve_mail;       zaizhi_o := vzaizhi;       postname_o := vpostname;       department_name_o := vdepartment_name;       velname_o := vvelname;       exception         when no_data_found then           name_o := '雇员编号未找到';end find_emp;

java调用代码:(只贴出核心部分,其他的数据库连接自己搞定)
cstmt = conn.prepareCall(sql);cstmt.setInt(1, employeId);//对应输入参数员工号cstmt.registerOutParameter(2, java.sql.Types.INTEGER);//对应输出参数idcstmt.registerOutParameter(3, java.sql.Types.INTEGER);//对应输出参数员工号cstmt.registerOutParameter(4, java.sql.Types.VARCHAR);//对应输出参数名字cstmt.registerOutParameter(5, java.sql.Types.CHAR);//对应输出参数性别cstmt.registerOutParameter(6, java.sql.Types.DATE);//对应输出参数生日cstmt.registerOutParameter(7, java.sql.Types.DATE);//对应输出参数入职日期cstmt.registerOutParameter(8, java.sql.Types.DOUBLE);//对应输出参数电话cstmt.registerOutParameter(9, java.sql.Types.VARCHAR);//对应输出参数emailcstmt.registerOutParameter(10, java.sql.Types.INTEGER);//对应输出参数在职cstmt.registerOutParameter(11, java.sql.Types.VARCHAR);//对应输出参数职位cstmt.registerOutParameter(12, java.sql.Types.VARCHAR);//对应输出参数部门cstmt.registerOutParameter(13, java.sql.Types.VARCHAR);//对应输出参数级别//执行查询cstmt.execute();//输出e.setId(cstmt.getInt(2));e.setEid(cstmt.getInt(3));e.setName(cstmt.getString(4));e.setGender(cstmt.getString(5));e.setBornDate(cstmt.getDate(6));e.setJoinDate(cstmt.getDate(7));e.setPhone(cstmt.getString(8));e.setEmail(cstmt.getString(9));e.setZaizhi(cstmt.getByte(10));//职位对象获取职位的方法p.setPostName(cstmt.getString(11));e.setPost(p);//部门对象获取部门的方法d.setDepartmentName(cstmt.getString(12));e.setDepartment(d);//级别对象获取级别的方法l.setLevelName(cstmt.getString(13));e.setLevel(l)

调用的方式和上面说的一样,as下是放自定义的变量,begin到End是PL/SQL语句,PL/SQL中的空值使用is null来表示,非空为:is not null,这和java程序有所区别,PL/SQL有时间再详解

注:存储过程还有一种返回情况,返回的是多条记录,既结果集,而不是单条记录,则不能使用上面的那种方法,得使用游标输出结果集,同时select 某表的字段1,字段2……
into 变量1,变量2 from 表 where 表字段=某个值这种方式也不能使用,因为select into语句只使用返回单条记录的情况。在java调用存储过程也不能使用

cs.registerOutParameter(参数位置, Types.VARCHAR)了,存储过程返回结果集的java调用下回详解……

原创粉丝点击