oracle调用存储过程和函数返回结果集

JAVA调用ORACLE的存储过程、函数的返回结果集

2017年05月11日 21:03:18 彖爻之辞 阅读数:1091 标签: oracle存储 更多

个人分类: --------1.1 ORACLE

具体过程如下:

CREATE TABLE STOCK_PRICES(
    RIC VARCHAR(6) PRIMARY KEY,
    PRICE NUMBER(7,2),
    UPDATED DATE );

--对表插入数据
INSERT INTO stock_prices SELECT '1110',1.0,SYSDATE FROM DUAL;
INSERT INTO stock_prices SELECT '1111',2.0,SYSDATE FROM DUAL;
INSERT INTO stock_prices SELECT '1112',3.0,SYSDATE FROM DUAL;
INSERT INTO stock_prices SELECT '1113',4.0,SYSDATE FROM DUAL;

--建立一个返回游标
CREATE OR REPLACE PACKAGE ZZH_TEST.PKG_PUB_UTILS IS
    --动态游标
    TYPE REFCURSOR IS REF CURSOR;
END PKG_PUB_UTILS;

--创建一个测试用的存储过程
CREATE OR REPLACE PROCEDURE ZZH_TEST.P_GET_PRICE(AN_O_RET_CODE         OUT NUMBER,
                                                 AC_O_RET_MSG          OUT VARCHAR2,
                                                 CUR_RET               OUT PKG_PUB_UTILS.REFCURSOR,
                                                 AN_I_PRICE IN NUMBER
                                                 ) IS
BEGIN
    AN_O_RET_CODE := 0;
    AC_O_RET_MSG  := '操作成功';

    OPEN CUR_RET FOR
        SELECT * FROM STOCK_PRICES WHERE PRICE<AN_I_PRICE;
EXCEPTION
    WHEN OTHERS THEN
        AN_O_RET_CODE := -1;
        AC_O_RET_MSG  := '错误代码:' || SQLCODE || CHR(13) || '错误信息:' || SQLERRM;

END P_GET_PRICE;

--创建一个测试用的函数:
CREATE OR REPLACE FUNCTION ZZH_TEST.F_GET_PRICE(v_price IN NUMBER)
    RETURN PKG_PUB_UTILS.REFCURSOR
AS
    stock_cursor PKG_PUB_UTILS.REFCURSOR;
BEGIN
    OPEN stock_cursor FOR
    SELECT ric,price,updated FROM stock_prices WHERE price < v_price;

    RETURN stock_cursor;
END;

--开发JAVA调用存储过程返回结果集的例子:JDBCoracle10G_INVOKEPROCEDURE 
--开发JAVA调用函数返回结果集的例子:JDBCoracle10G_INVOKEFUNCTION

--2份JAVA源代码:

-- 开发JAVA调用存储过程返回结果集的例子:JDBCoracle10G_INVOKEPROCEDURE

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
 /* 本例是通过调用oracle的存储过程来返回结果集:
  * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip
  */
 public class JDBCoracle10G_INVOKEPROCEDURE {
  Connection conn = null;
  Statement statement = null;
  ResultSet rs = null; 
  CallableStatement stmt = null;


  String driver;
  String url;
  String user;
  String pwd; 
  String sql;
  String  in_price ;  
  public  JDBCoracle10G_INVOKEPROCEDURE()
  {   
   driver = "oracle.jdbc.driver.OracleDriver";;
   url = "jdbc:oracle:thin:@10.168.1.193:1521:orcl"; 
   //oracle 用户
   user = "ZZH_TEST";
   //oracle 密码   
   pwd = "ZZH_TEST";

   init();

   //mysid:必须为要连接机器的sid名称,否则会包以下错:
   //     java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
   //参考连接方式:
   //   Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
   //   cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );   

  }

  public void init()
  {

   System.out.println("oracle jdbc test");

   try{
      Class.forName(driver);
      System.out.println("driver is ok");

      conn = DriverManager.getConnection(url,user,pwd);
      System.out.println("conection is ok");

      statement = conn.createStatement();
         // conn.setAutoCommit(false);

      //输入参数
       in_price="3.0";

       //调用函数
       stmt = conn.prepareCall( "call P_GET_PRICE(?,?,?,?)");
       stmt.registerOutParameter(1, java.sql.Types.FLOAT);
       stmt.registerOutParameter(2, java.sql.Types.CHAR);
       stmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);
       stmt.setString(4, in_price);
       stmt.executeUpdate();
       int retCode = stmt.getInt(1);
       String retMsg = stmt.getString(2);
       if (retCode == -1) { //如果出错时,返回错误信息
       System.out.println("报错!");
       } else {
       //取的结果集的方式一:
           rs = ((OracleCallableStatement)stmt).getCursor(3);
        //取的结果集的方式二:
             //  rs = (ResultSet) stmt.getObject(3);

        String ric ;
     String price ;
     String updated ;
        //对结果进行输出
     while(rs.next()){
      ric = rs.getString(1);
      price = rs.getString(2);
      updated = rs.getString(3);      

      System.out.println("ric:"+ric+";-- price:"+price+"; --"+updated+"; "); 
     }
       }

    }
       catch(Exception e)
    {
     e.printStackTrace();
    }
          finally{
           System.out.println("close ");
       }       
  }

  public static void main(String args [])//自己替换[]
  {
   new JDBCoracle10G_INVOKEPROCEDURE();
  }
  }

--=======================================================================

--源代码:

--开发JAVA调用函数返回结果集的例子:JDBCoracle10G_INVOKEFUNCTION

import java.sql.*;
import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;
 /*
 /* 本例是通过调用oracle的函数来返回结果集:
  * oracle 9i、10G 的jdbc由1个jar包组成:classes12.zip  
  */
 public class JDBCoracle10G_INVOKEFUNCTION {
  Connection conn = null;
  Statement statement = null;
  ResultSet rs = null; 
  CallableStatement stmt = null;

  String driver;
  String url;
  String user;
  String pwd; 
  String sql;
  String  in_price ;  
  public  JDBCoracle10G_INVOKEFUNCTION()
  {
   driver = "oracle.jdbc.driver.OracleDriver";;
   url = "jdbc:oracle:thin:@10.168.1.193:1521:orcl"; 
   //oracle 用户
   user = "ZZH_TEST";
   //oracle 密码   
   pwd = "ZZH_TEST";

   init();

   //mysid:必须为要连接机器的sid名称,否则会包以下错:
   //     java.sql.SQLException: Io 异常: Connection refused(DESCRIPTION=(TMP=)(VSNNUM=169870080)(ERR=12505)(ERROR_STACK=(ERROR=(CODE=12505)(EMFI=4))))
   //参考连接方式:
   //   Class.forName( "oracle.jdbc.driver.OracleDriver" ); 
   //   cn = DriverManager.getConnection( "jdbc:oracle:thin:@MyDbComputerNameOrIP:1521:ORCL", sUsr, sPwd );   
  }

  public void init()
  {
   System.out.println("oracle jdbc test");

   try{
      Class.forName(driver);
      System.out.println("driver is ok");

      conn = DriverManager.getConnection(url,user,pwd);
      System.out.println("conection is ok");

      statement = conn.createStatement();
       //conn.setAutoCommit(false);

      //输入参数      
       in_price="5.0";

       //调用函数
       stmt = conn.prepareCall("{? = call F_GET_PRICE(?)}");
      // stmt.registerOutParameter(1, java.sql.Types.FLOAT);
      // stmt.registerOutParameter(2, java.sql.Types.CHAR);
       stmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
       stmt.setString(2, in_price);
       stmt.executeUpdate();
       //取的结果集的方式一:
            rs = ((OracleCallableStatement)stmt).getCursor(1);
       //取的结果集的方式二:
          //  rs = (ResultSet) stmt.getObject(1);
         String ric ;
     String price ;
     String updated ;

     while(rs.next()){
      ric = rs.getString(1);
      price = rs.getString(2);
      updated = rs.getString(3);                 
         System.out.println("ric:"+ric+";-- price:"+price+"; --"+updated+"; "); 
     }

    }
       catch(Exception e)
    {
     e.printStackTrace();
    }
          finally{
           System.out.println("close ");
       }       
  }

  public static void main(String args [])//自己替换[]
  {
   new JDBCoracle10G_INVOKEFUNCTION();
  }
  }

https://blog.csdn.net/paul50060049/article/details/71698108

 

 

 

 

 

oracle调用存储过程和函数返回结果集

2010年10月21日 13:56:00  阅读数:25787

   在程序开发中,常用到返回结果集的存储过程,这个在mysqlsql server 里比较好处理,直接返回查询结果就可以了,
但在oracle里面 要 out 出去,就多了一个步骤,对于不熟悉的兄弟们还得出上一头汗:),这里我简单介绍一下,以供参考,
   1  定义包
      oracle 返回的结果集需要自定义一个 CURSOR (游标变量)性质的变量,这个要在包头定义,所以要建立一个包,如下是包头

Pl/sql代码

CREATE OR REPLACE PACKAGE PAK_rstest

  IS

    TYPE   retcursor    IS   REF   CURSOR;

   PROCEDURE pro_read

     (

       outcurse  IN OUT retcursor

     );

   END; -- Package spec

 

 

 

 

 

 

 

 

     上面是建立了一个名称为PAK_rstest的包头,里面定义了一个CURSOR 类型,类型名为retcursor ,有了这个定义我们就可以用他来返回结果集了,比如该包里面的 pro_read 过程就是 一个返回结果集的过程,下面是他的包体,

Pl/sql代码

CREATE OR REPLACE PACKAGE BODY PAK_rstest IS

   PROCEDURE pro_read

   (

       outcurse  IN OUT retcursor

   )

   IS

   begin

        OPEN outcurse FOR

         select * from tbl_test

                where rownum<6;

        return;

   end;

 

END;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

    这样就定义好了一个包,这个包里面有个返回结果集的过程 pro_read
  

 2 在程序里面调用,
     下面就是如果在程序里面调用了,这里用java为例子简单介绍一下,
     假设你现在已经有一个Connection  conn 对象连接上了数据库(如何连接数据库我这里就不详细说了), 
     
则用下面的代码调用过程,

Pl/sql代码

 

if(conn !=null){

    String sqlstr = "{call  PAK_SMS2_ROUTE.MO_ISSUE(?)}";

     CallableStatement cstmt = conn.prepareCall(sqlstr);

     cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR); //outcurse

     cstmt.executeUpdate();

     ResultSet rs = (ResultSet) cstmt.getObject(1); // 这里吧信息已经读入rs结果集里面,剩下的大家都熟悉了吧

   while (rs.next()) {

        System.out.println(rs.getString("s_date1")); //tbl_test 表里的字段名称或是结果集的列名称

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

      }   

         conn.close();

         conn = null;       

}

 

 

 

 

 

 

 

 

 

 

 

 

 

  好了到这里就可以看到返回的结果集内容了,是不是比较简单啊,:)

   Oracle 存储过程返回结果集:

过程返回记录集代码

 

CREATE OR REPLACE PACKAGE pkg_test

AS

    TYPE myrctype IS REF CURSOR;

 

    PROCEDURE get (p_id NUMBER, p_rc OUT myrctype);

END pkg_test;

 

 

CREATE OR REPLACE PACKAGE BODY pkg_test

AS

    PROCEDURE get (p_id NUMBER, p_rc OUT myrctype)

    IS

       sqlstr   VARCHAR2 (500);

    BEGIN

       IF p_id = 0 THEN

          OPEN p_rc FOR

             SELECT ID, NAME, sex, address, postcode, birthday

               FROM student;

       ELSE

          sqlstr :=

             'select id,name,sex,address,postcode,birthday

            from student where id=:w_id';

          OPEN p_rc FOR sqlstr USING p_id;

       END IF;

    END get;

END pkg_test;  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

函数返回记录集:
建立带ref cursor定义的包和包体及函数:

 

函数返回记录集代码

CREATE OR REPLACE

package pkg_test as

/* 定义ref cursor类型

    不加return类型,为弱类型,允许动态sql查询,

    否则为强类型,无法使用动态sql查询;

*/

 

   type myrctype is ref cursor; 

  

--函数申明

   function get(intID number) return myrctype;

end pkg_test; 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

包体代码

 

CREATE OR REPLACE

package body pkg_test as

--函数体

    function get(intID number) return myrctype is

      rc myrctype;  --定义ref cursor变量

      sqlstr varchar2(500);

    begin

      if intID=0 then

         --静态测试,直接用select语句直接返回结果

         open rc for select id,name,sex,address,postcode,birthday from

student;

      else

         --动态sql赋值,用:w_id来申明该变量从外部获得

         sqlstr := 'select id,name,sex,address,postcode,birthday from

student where id=:w_id';

         --动态测试,用sqlstr字符串返回结果,用using关键词传递参数

         open rc for sqlstr using intid;

      end if;

  

      return rc;

    end get;

  

end pkg_test;

 

Java调用oracle函数返回游标处理代码

 

CallableStatement cstmt = null;

ResultSet rs = null;

try {

String callSql = "{? = call AAAAA(?)}";

cstmt = conn.prepareCall(callSql);

   

cstmt.setString(2, "userName");

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

cstmt.execute();

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

if (rs != null) {

       System.out.print("usercd");

       System.out.print("userName");               

       System.out.println("EMAIL");

       while (rs.next()) {       

    System.out.print(rs.getString(1)+"   ");

    System.out.print(rs.getString(2)+"   ");               

    System.out.println(rs.getString(3));

       }   

}

https://blog.csdn.net/whaosy/article/details/5956460

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值