日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/3/20 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中调用存储过程或存储函数的方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。