Oracle存储过程及调用
Oracle存储过程语法 Oracle的存储过程语法如下: (2)带参数的存储过程语法: (3)带输入、输出参数的存储过程语法: 注意:用上面的语法创建存储过程时可能会碰到数据库中已经有了同名的存储过程,这样Oracle就会弹框报错,说名字已被现有对象使用。解决方法有两种: 方法一:换个存储过程名 方法二:在最开头的create procedure 之间加上 or replace 关键字,例如:create or replace procedure 存储过程名称。但是这种方法不建议使用,因为这种方法会把之前同名的存储过程替换为你当前写的这个 存储过程案例一:没参数的存储过程存储过程案例二:带参数的的存储过程存储过程案例三:带输入、输出参数的存储过程存储过程的参数分为输入参数和输出参数, 输入参数:输入参数一般会在变量名和数据类型之间加in来表示该参数是输入参数 输出参数:输出参数一般会在变量名和数据类型之间加out来表示该变量是输出参数 不写in和out的话,默认为输入参数 PL/SQL块中调用存储过程 下面以调用上面三个存储过程为例 java调用存储过程 案例一:java调用没有返回值的存储过程要求:编写一个像数据库emp表插入一条编号为6666,姓名为张三,职位为MANAGER的记录 public static void main(String[] args) { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; //java调用存储过程 try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl","scott","tiger"); cs=conn.prepareCall("{call procedure_4(?,?,?)}"); //给输入参数赋值 cs.setInt(1,6666); cs.setString(2,"张三"); cs.setString(3,"MANAGER"); cs.execute();//执行 } catch (Exception e) { e.printStackTrace(); }finally{ closeResource(conn,cs,rs);//关闭资源 } } //执行后就会向数据库的emp表中插入一条编号为6666,姓名为张三,职位为MANAGER的记录 案例二:java调用返回单列单行的存储过程要求:编写一个根据员工编号查找员工姓名的存储过程,并用java调用该存储过程 //java调用存储过程public static void main(String[] args) { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl","tiger"); cs=conn.prepareCall("{call procedure_5(?,?)}"); cs.setInt(1,6666);//给输入参数赋值 /指定输出参数的数据类型 语法:oracle.jdbc.OracleTypes.输出参数的数据类型 此例输出参数的数据类型是varchar,所以是oracle.jdbc.OracleTypes.VARCHAR/ cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); cs.execute();//执行 //获取输出参数的值,位置要和输出参数对应?的位置对应起来,该例输出参数对应第2个问号,而且输出参数的数据类型为字符型,所以是cs.getString(2) String a=cs.getString(2); System.out.println("员工姓名:"+a); } catch (Exception e) { e.printStackTrace(); }finally{ closeResource(conn,rs);//关闭资源 } } /执行结果,控制台打印:/ 案例三:java调用返回单行多列的存储过程 要求:编写一个根据员工编号查找员工姓名、职位和工资的存储过程,并用java调用该存储过程 public static void main(String[] args) { Connection conn=null; CallableStatement cs=null; ResultSet rs=null; try { Class.forName("oracle.jdbc.OracleDriver"); conn=DriverManager.getConnection("jdbc:oracle:thin:@127.0.01:1521:orcl","tiger"); cs=conn.prepareCall("{call procedure_6(?,7788); //指定输出参数的数据类型,注意:顺序要对应起来 cs.registerOutParameter(2,oracle.jdbc.OracleTypes.VARCHAR); cs.registerOutParameter(3,oracle.jdbc.OracleTypes.VARCHAR); cs.registerOutParameter(4,oracle.jdbc.OracleTypes.DOUBLE); cs.execute();//执行 //获取返回值 String ename=cs.getString(2);//获取姓名 String job=cs.getString(3);//获取职位 double sal=cs.getDouble(4);//获取薪水 System.out.println("员工编号为7788的姓名为:"+ename+" 职位是:"+job+" 薪水是:"+sal); } catch (Exception e) { e.printStackTrace(); }finally{ closeResource(conn,rs);//关闭资源 } } /执行结果,控制台打印:/ 员工编号为7788的姓名为:SCOTT 职位是:ANALYST 薪水是:3000.0 案例四:java调用返回多行多列(返回列表)的存储过程 要求:编写一个根据部门编号查找部门所有员工信息的存储过程,并用java调用该存储过程 /*以下就是20号部门所有员工的信息,这里为方便我们只打印了编号、姓名和入职时间 运行结果,控制台打印:*/ 这是上面java调用存储过程代码中关闭资源方法的代码 最后给个应用,分页的存储过程 分页存储过程: ='||v_begin; /*不能像下面这么写,不然调用该存储过程时会报类型不一致的错,因为最里面查的只有empno,ename,因此外面也要和里面保持一致 v_sql varchar2(1000):='select * from (select a.*,ename from emp) a where rownum<='|| v_end ||') b where b.rn>='||v_begin;*/ v_ename varchar2(10); v_empno number(4); begin open emp_cursor for v_sql; loop fetch emp_cursor into v_empno,v_ename; exit when emp_cursor%notfound; dbms_output.put_line(v_empno||' '||v_ename); end loop; v_sql:='select count(empno) from emp'; execute immediate v_sql into v_total_count; if(mod(v_total_count,v_page_size)=0) then v_page_count:=v_total_count/v_page_size; else v_page_count:=trunc(v_total_count/v_page_size)+1; end if; dbms_output.put_line('共 '||v_total_count||' 条记录'); dbms_output.put_line('共 '||v_page_count||' 页'); dbms_output.put_line('当前页: '||v_current_page); dbms_output.put_line('每页显示 '||v_page_size||' 条'); end;Java调用的话和上面java调用存储过程的例子一样。这里为了方便 ,就直接在pl/sql中调用了 以上所述是小编给大家介绍的Oracle存储过程及调用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程之家网站的支持! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |