1.先在创建一个存储过程,
(1)先创建包
create or replace package lff_test_package is procedure lff_test_procedure(id in number,org out varchar2,po_fhz out varchar2,po_msg out varchar2); end lff_test_package;
说明:id是number类型的需要传入的参数,org,po_phz,po_msg是varchar2类型的传出的参数。
(2)创建包的实体
create or replace package body lff_test_package as procedure lff_test_procedure(id in number,org out varchar2,po_fhz out varchar2,po_msg out varchar2) as --定义其他需要使用的变量,需要指定类型及其大小如 username varchar2(20) 而存储过程名称括号里面的输入和输出参数是没有指定类型大小的 begin --select * into org from xx where xxx = id; org := 'aaa'; po_fhz := '1'; po_msg := '调用成功'; exception when others then po_fhz := '-1'; po_msg := '调用不成功'; end; end lff_test_package;
注意:exception表示出现错误时的处理。when others子句用于捕获命名异常和命名的程序员定义异常未处理的所有其余异常。我自己的理解就是相当于java中的try{}catch(exception e){}中的exception。
2.利用jdbc调用数据库的存储过程。
/** * @date 2017-6-6 * @author liufeifei * @description 测试调用数据库的存储过程 */ public class testprocedure { public static void main(string[] args) { //数据库驱动的名称 string driver = "oracle.jdbc.oracledriver"; //访问数据库路径 localhost表示本机(127.0.0.1),xxx表示数据库名称 string url = "jdbc:oracle:thin:@localhost:1521:xxx"; //用户名 string username = "kfxx"; //密码 string password = "kfxx"; connection conn = null; callablestatement statement = null; try { //加载驱动 class.forname(driver); //连接 conn = drivermanager.getconnection(url, username, password); //请求的存储过程(包名.存储过程名称,四个?表示参数) string sql = "{call lff_test_package.lff_test_procedure(?,?,?,?)}"; statement = conn.preparecall(sql); //传入的参数 statement.setint(1,21); //返回的参数(oracle.jdbc.oracletypes.varchar表示返回参数类型) statement.registeroutparameter(2,oracle.jdbc.oracletypes.varchar); statement.registeroutparameter(3,oracle.jdbc.oracletypes.varchar); statement.registeroutparameter(4,oracle.jdbc.oracletypes.varchar); //执行 statement.execute(); //拿到返回的值,我的存储过程的参数1是传入参数,2,3,4是传出参数 system.out.println(statement.getstring(2) + " "+ statement.getstring(3) + " "+ statement.getstring(4)); } catch (classnotfoundexception e) { e.printstacktrace(); } catch (sqlexception e) { e.printstacktrace(); }finally{ try { //关闭连接 if(statement != null){ statement.close(); } if(conn != null){ conn.close(); } } catch (sqlexception ex1) { } } } }
还有几个需要注意的点:
1.preparedstatement,callablestatement和statement之间的联系区别。
2.对于有多条返回记录的处理,resultset的遍历,光标等等定义。
3.对错误exception的处理。
以上有兴趣深究的朋友可以去看看别人的博客,现在工作了没有这么多时间去研究,但是会找时间补回来。写博客也是自己做个学习记录。谢谢大家浏览到最后,有什么好的建议也可以浏览提给我,不胜感激。