java 调用oracle存储过程 (带out parameter)

备注:

    1、写存储过程时,注意commit提交;

    2、oracle默认转义字符为单引号‘;

    3、存储过程带参数时,注意要把out类型的写在前面,否则,可能报错(用游标类型就会报错);

    4、调用函数和调用存储过程类似,也要cs.registerOutParameter(1, java.sql.Types.VARCHAR);

 

 

首先我们以一个简单的例子开始,在这个例子中,只存在一个返回值。存储过程如下

SQL> create or replace procedure lizhe (aa out varchar2)is
 begin
select password into aa from passport where id='123111';
end ;
  /

补充说明:要注意的是这个存储过程存在一个(aa out varchar2)这样的标识,这是一个参数,out表示这是一个输出参数,在select语句中将password的值“into”到这个参数里


然后再java端:

public static void runProcedure(){
   try {
    Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
    Connection con = DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.159:1521:TOPS","YAC3","YAC3");
    java.sql.CallableStatement cs = con.prepareCall("{call lizhe(?)}");
    cs.registerOutParameter(1, java.sql.Types.VARCHAR);
    cs.execute();
    System.out.print("value2:" + cs.getString(1)); //取出字符串——关键


   } catch (InstantiationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IllegalAccessException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (ClassNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
}


补充说明:cs.registerOutParameter(1, java.sql.Types.VARCHAR);
重点只有这一句

 

 

2.多个返回值的

SQL> CREATE OR REPLACE PACKAGE TESTPACKAGE AS

 TYPE Test_CURSOR IS REF CURSOR;
 
end TESTPACKAGE;
 /

Package created

SQL> CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS

 BEGIN
    --此处可以使用临时表将统计数据存入临时表TB,然后在select from 临时表TB
     OPEN p_CURSOR FOR 'SELECT * FROM TB';

 END TESTC;
 /

Procedure created


import java.sql.*;

import java.io.OutputStream;

import java.io.Writer;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import oracle.jdbc.driver.*;


public class TestProcedure {

public TestProcedure() {

}

public static void main(String[] args ){

    String driver = "oracle.jdbc.driver.OracleDriver";

    String strUrl = "jdbc:oracle:thin:@192.168.0.159:1521:tops";

    Statement stmt = null;

    ResultSet rs = null;

    Connection conn = null;


    try {

      Class.forName(driver);

      conn = DriverManager.getConnection(strUrl, "yac3", "yac3");


      CallableStatement proc = null;

      proc = conn.prepareCall("{call testc(?)}");

      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

      proc.executeQuery();

      rs = (ResultSet)proc.getObject(1);


      while(rs.next())

      {

         System.out.println(rs.getString("VALUE"));

      }

    }

    catch (SQLException ex2) {

      ex2.printStackTrace();

    }

    catch (Exception ex2) {

      ex2.printStackTrace();

    }

    finally{

      try {

        if(rs != null){

          rs.close();

          if(stmt!=null){

            stmt.close();

          }

          if(conn!=null){

            conn.close();

          }

        }

      }

      catch (SQLException ex1) {

      }

    }

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值