jdbc oracle 过程调用

 
Java代码 复制代码  收藏代码
  1. jdbc调用返回游标的oracle存储过程   
  2. 文章分类:Java编程   
  3.   
  4. 项目中学习技术,这句话真是有道理啊,呵呵   
  5.   
  6. 在此次项目中,由于sql比较复杂,就使用存储过程来处理,但是需要返回一个数据集,这就想到了使用游标,但是之前的项目一直没有用过,需要学习一下。今天周末,就利用这个时间收集资料,学习了一下,下面将学习结果总结如下。   
  7.   
  8. 表结构:   
  9.   
  10. create table item   
  11.   
  12. (   
  13.       item_id varchar2(32),   
  14.   
  15.       itemname varchar2(50)   
  16.   
  17. )   
  18.   
  19. 一.写一个返回游标的存储过程   
  20. Sql代码   
  21.   
  22.    1. create or replace procedure getcur(p_rc out sys_refcursor)     
  23.    2.     is     
  24.    3.      begin     
  25.    4.           open p_rc for 'select * from item';     
  26.    5. end getcur;     
  27.   
  28. create or replace procedure getcur(p_rc out sys_refcursor)   
  29.     is   
  30.      begin   
  31.           open p_rc for 'select * from item';   
  32. end getcur;   
  33.   
  34.  sys_refcursor这个是oracle自带的返回游标的类型。   
  35.   
  36. 二.写一段pl/sql测试一下存储过程是否正确   
  37. Sql代码   
  38.   
  39.    1. declare      
  40.    2.       items sys_refcursor;     
  41.    3.   begin     
  42.    4.        getcur(items);     
  43.    5.        for item in items     
  44.    6.        loop     
  45.    7.            dbms_output.put_line(item.itemname);     
  46.    8.        end loop;     
  47.    9.  end;     
  48.   
  49.  declare    
  50.        items sys_refcursor;   
  51.    begin   
  52.         getcur(items);   
  53.         for item in items   
  54.         loop   
  55.             dbms_output.put_line(item.itemname);   
  56.         end loop;   
  57.   end;   
  58.   
  59.     
  60.   
  61. 三.写一段java代码测试   
  62. Java代码   
  63.   
  64.    1public void testcur() {     
  65.    2.  Connection conn = this.getSession().connection();     
  66.    3.  CallableStatement callsta = null;     
  67.    4.  ResultSet rs = null;     
  68.    5.  try {     
  69.    6.   callsta = conn.prepareCall("{call getcur(?)}");     
  70.    7.   callsta.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);     
  71.    8.   callsta.execute();     
  72.    9.   rs = (ResultSet)callsta.getObject(1);     
  73.   10.   while(rs.next()){     
  74.   11.    System.out.println(rs.getString(1));     
  75.   12.   }     
  76.   13.   rs.close();     
  77.   14.   callsta.close();     
  78.   15.   conn.close();     
  79.   16.  } catch (Exception e) {     
  80.   17.   e.printStackTrace();     
  81.   18.  }     
  82.   19. }     
  83.   
  84. public void testcur() {   
  85.  Connection conn = this.getSession().connection();   
  86.  CallableStatement callsta = null;   
  87.  ResultSet rs = null;   
  88.  try {   
  89.   callsta = conn.prepareCall("{call getcur(?)}");   
  90.   callsta.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);   
  91.   callsta.execute();   
  92.   rs = (ResultSet)callsta.getObject(1);   
  93.   while(rs.next()){   
  94.    System.out.println(rs.getString(1));   
  95.   }   
  96.   rs.close();   
  97.   callsta.close();   
  98.   conn.close();   
  99.  } catch (Exception e) {   
  100.   e.printStackTrace();   
  101.  }   
  102. }   
  103.   
  104.  1. {call getcur(?)}:调用存储过程,?代码参数   
  105.   
  106.  2. callsta.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);这个是设置返回类型,之前使用   
  107.   
  108.         java.sql.Types.REF一直报错“java.sql.SQLException: ORA-03115: 不支持的网络数据类型或表示法”,   
  109.   
  110.         查询了一下,使用oracle.jdbc.OracleTypes.CURSOR这个就没有问题了。   
  111.   
  112.  3.网上查了下,说是可以使用oracle.jdbc.OracleCallableStatement来代替CallableStatement ,   
  113.   
  114.     返回结果的时候使用rs = cs.getCursor(1);就可以得到,但是我的使用报类型错误,   
  115.   
  116.     分析原因,应该是我使用了连接池c3p0,所以总是报错  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用JavaJDBCJava Database Connectivity)来调用Oracle数据库中的存储过程。下面是调用存储过程的一般步骤: 1. 首先,确保你已经正确地设置了Oracle数据库连接信息,并且已经导入了相关的JDBC驱动。 2. 创建一个Connection对象,用于与数据库建立连接。例如: ```java String url = "jdbc:oracle:thin:@localhost:1521:xe"; String username = "your_username"; String password = "your_password"; Connection connection = DriverManager.getConnection(url, username, password); ``` 3. 创建一个CallableStatement对象,用于执行存储过程。例如: ```java String sql = "{call your_procedure_name(?, ?)}"; CallableStatement cstmt = connection.prepareCall(sql); ``` 4. 设置存储过程的输入参数(如果有)。例如: ```java cstmt.setString(1, "input_parameter_value"); ``` 5. 注册输出参数(如果有)。例如: ```java cstmt.registerOutParameter(2, Types.INTEGER); // 第二个参数为输出参数的位置和类型 ``` 6. 执行存储过程。例如: ```java cstmt.execute(); ``` 7. 获取输出参数的值(如果有)。例如: ```java int outputValue = cstmt.getInt(2); // 获取第二个输出参数的值 ``` 8. 关闭CallableStatement和Connection对象。例如: ```java cstmt.close(); connection.close(); ``` 这是一个基本的jdbc调用存储过程的示例,你可以根据实际情况进行适当的修改和调整。注意,在使用JDBC调用Oracle存储过程时,需要根据具体的存储过程定义和参数类型进行相应的设置和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值