java怎么调用存储函数_java中调用存储过程或存储函数的方法
java中調用存儲過程或存儲函數的方法
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個變
總結
以上是生活随笔為你收集整理的java怎么调用存储函数_java中调用存储过程或存储函数的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java_opts gc回收器_JVM之
- 下一篇: java获取系统运行日志文件_java