java怎么调用存储函数_java中调用存储过程或存储函数的方法

41528d3028836879cd698677c3999917.gifjava中调用存储过程或存储函数的方法

1.调用存储过程:CallableStatement clstmt = null;try {clstmt = conn.prepareCall(“{call package_name.procedure_name(?,?,?,?,?)}“);clstmt.setString(1, bill.getBillType());clstmt.setString(2, bill.getId());clstmt.setInt(3, bill.getNum());clstmt.registerOutParameter(4, Types.CHAR); clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.cute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}2.调用存储函数:CallableStatement clstmt = null;try {clstmt = conn.prepareCall(“{? = call package_name.function_name(?,?,?,?)}“);clstmt.registerOutParameter(1, Types.VARCHAR);clstmt.setString(2, bill.getBillType());clstmt.setString(3, bill.getId());clstmt.registerOutParameter(4, Types.CHAR); clstmt.registerOutParameter(5, Types.VARCHAR);clstmt.cute();out_opresult = clstmt.getString(4).trim();out_operror = clstmt.getString(5).trim();} catch (SQLException e) {System.out.println(e.getMessage());}* 存储过程编写时应注意:1.输出参数不能作为查询条件;eg: 假设,out_id 已赋值,SELECT name INTO out_nameFROM tb_testWHERE id = out_id;这样写 PL/SQL中会正常通过,而在 Java程序调用该存储过程时会报错,需要改成:v_id CHAR(8) := ;先对 v_id赋值,SELECT name INTO out_nameFROM tb_testWHERE id = v_id;这样 PL/SQL和 Java程序中都可正常通过和调用。2.如存储过程中带有 Date、Boolean 型参数,Java 程序调用时会出错,报类型不匹配,目前只能不用 Date、Boolean 型作为存储过程参数,可能的原因:JDBC 不支持。 。 。测试程序如下:存储函数如下:FUNCTION my_test(in_test1 IN CHAR,in_test2 IN BOOLEAN,out_test3 OUT VARCHAR) RETURN VARCHAR ISv_test CHAR(3) := ;BEGINselect aaa into v_test from dual;Return OK ;EXCEPTIONWHEN OTHERS THENout_test3 := SQLCODE;Return SQLCODE;END; Java代码如下:try {clstmt = conn.prepareCall(“{? = call my_test(?,?,?)}“);clstmt.registerOutParameter(1, Types.VARCHAR);clstmt.setString(2, “1111111“);clstmt.setBoolean(3, false);clstmt.registerOutParameter(4, Types.VARCHAR);clstmt.cute();} catch (SQLException e) {System.out.println(e.getMessage());}一个简单的调用,报错:ORA-06550: line 1, column 13:PLS-00306: wrong number or types of arguments in call to MY_TEST ORA-06550: line 1, column 7:PL/SQL: Statement ignored得出结论的测试程序:建一个只有一个 boolean型返回的 funciton,然后用for (int i=-3000;i<=3000;i++){clstmt.registerOutParameter(1, i);}去逐个测试,遗憾的是,在-3000-3000 中,没有一种合适的!也就是说现有的 JDBC没有对 Boolean类型提供足够的支持。目前只对 Boolean型做了测试。3.每次重新编译存储过程后,Java 程序调用存储过程都报:ORA-04068: existing state of packages这个错。查了一下这个存储过程的 package,发现:flag_op_fail CONSTANT CHAR(1) := 1 ;flag_op_succ CONSTANT CHAR(1) := 0 ;not_existed CONSTANT CHAR(1) := 0 ;existed CONSTANT CHAR(1) := 1 ; PROCEDURE get_hos_info(in_hospital_id IN CHAR,out_existed OUT CHAR,out_name OUT CHAR,out_hos_class OUT CHAR,out_opresult OUT CHAR,out_operror OUT VARCHAR2) ISBEGINout_opresult := flag_op_fail;out_operror := NULL ;BEGINSELECT name, hos_class INTO out_name, out_hos_classFROM tb_dic_yljgWHERE hospital_id = in_hospital_id;out_existed := existed;out_opresult := flag_op_succ;out_operror := NO_ERROR ;RETURN;由于开始的 4个变量即(flag_op_fail, flag_op_succ, not_existed,existed)在整个 package中各个存储过程都有用到,所以单独声明在外面,也就是这 4个变

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值