zoukankan      html  css  js  c++  java
  • oracle调用存储过程和函数返回结果集

    在程序开发中,常用到返回结果集的存储过程,这个在mysql和sql 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));

           }   

    }

  • 相关阅读:
    swjtu oj Paint Box 第二类斯特林数
    B -- RE:从零开始的异世界生活 线段树
    EOJ Problem #3261 分词 trie + dp + 小剪枝
    129. 笔芯值
    F. Coprime Subsequences 莫比乌斯反演
    F. Clique in the Divisibility Graph DP
    D. Restructuring Company 并查集 + 维护一个区间技巧
    scut 125. 笔芯回文
    几个链接
    位处理的低级筛法
  • 原文地址:https://www.cnblogs.com/likeju/p/5009971.html
Copyright © 2011-2022 走看看