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中调用存储过程或存储函数的方法相关推荐

  1. java 调用matlab函数_java中调用Matlab的函数+注意事项

    一.matlab版本必须支持java 在command 模式下面运行deploytool,如果支持该命令即可使用 二.matlab中function的书写 %定义一个函数operation(a,b), ...

  2. java 对比函数_java中字符串比较函数和操作函数,详细解析

    java编程语言中关于字符的内容也是极其丰富的,所以学习这方面的知识也十分重要的.今天就来为大家介绍一些与java字符串有关的内容,也就是java中字符串比较函数和操作函数,并为大家进行详细的解析,一 ...

  3. java 获取键盘点击_Java中获取键盘输入值的三种方法介绍

    程序开发过程中,需要从键盘获取输入值是常有的事,但Java它偏偏就没有像c语言给我们提供的scanf(),C++给我们提供的cin()获取键盘输入值的现成函数!Java没有提供这样的函数也不代表遇到这 ...

  4. java 申请不定长度数组_java中申请不定长度数组ArrayList的方法

    如下所示: import java.util.ArrayList; //java中申请不定长度数组 public class Test01 { public static void main(Stri ...

  5. java list 对象 json字符串_Java中Json字符串直接转换为对象的方法(包括多层List集合)...

    使用到的类:net.sf.json.JSONObject 使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-b ...

  6. java 判断是否中文字符_java中判断字符串是否是中文的方法

    java中判断字符串是否是中文的方法 发布时间:2020-06-25 14:07:38 来源:亿速云 阅读:79 作者:Leah 本篇文章为大家展示了java判断字符串是否为中文的方法,代码简明扼要并 ...

  7. java 接受传感器的数据_java中调用第三方接口获取数据的方式

    //get请求方式 private String getInfo(Map params,String URL) { // 创建Httpclient对象 CloseableHttpClient http ...

  8. java after 函数_Java中关于Date的before函数和after函数的使用

    // before:d1.before(d2) 只有d1在d2之前才返回true  否则false 相当于 d1 < d2 // after: d1.after(d2) 只有d1在d2之后才返回 ...

  9. java 如何跳出if语句_java中跳出或终止if语句的方法

    1.break break:跳出当前循环:但是如果是嵌套循环,则只能跳出当前的这一层循环,只有逐层break才能跳出所有循环.for (int i = 0; i < 10; i++) { if ...

最新文章

  1. 【Paper】2021_Distributed Consensus Tracking of Networked Agent Systems Under Denial-of-Service Attack
  2. 图像处理(五)双指数磨皮
  3. python三引号 内部变量_python在三引号中使用变量
  4. 计算机在平面设计上的应用,计算机平面设计中设计软件的应用平面设计论文(word版)...
  5. 微软BI 之SSIS 系列 - MVP 们也不解的 Scrip Task 脚本任务中的一个 Bug
  6. 无法使用UI configuration的trouble shooting
  7. Verilog语言实现并行(循环冗余码)CRC校验
  8. 在没有数据集的情况下使用数据表
  9. Java JSP JSTL
  10. 知识点 - DataList中CheckBox实现单选
  11. 财务报表开发实例分析:几个通用维度介绍与关键点
  12. c语言标准库内存分配监控,C语言的本质(25)——C标准库之内存管理
  13. c#图片色阶调整、亮度调整
  14. Oracle远程服务端配置
  15. linux 查看分区
  16. 再谈KMP/BM算法(I)
  17. 国学精华,千古绝唱500句
  18. 【SSM电商项目后台开发】001-数据库建表
  19. 易语言自学视频教程,第一次接触易语言的感受!
  20. UVM:7.5.2 常用操作及其对期望值和镜像值的影响

热门文章

  1. [How TO]-ubuntu下安装selenium
  2. MTK for Google AttestationKey介绍
  3. 类的实例方法静态方法类方法属性方法属性
  4. Xposed框架实战
  5. 以管理员权限来进行解压操作
  6. c++11中智能指针的原理,使用,实现
  7. 让你不再对网络安全产生七种误解
  8. python爬虫,爬取糗事百科并保存到文件中
  9. 【Excel】日常记录
  10. 2021夏季每日一题 【week7 完结】