zoukankan      html  css  js  c++  java
  • Oracle中函数/过程返回结果集的几种方式

    Oracle中函数/过程返回结果集的几种方式

    注:本文来源于:《  Oracle中函数/过程返回结果集的几种方式  》

    Oracle中函数/过程返回结果集的几种方式:

     

    以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.


    (1) 返回游标:


            return的类型为:SYS_REFCURSOR
            之后在IS里面定义变量:curr SYS_REFCURSOR;
            最后在函数体中写:
             open cur for
                select ......;
             return cur;
            例:

      1 CREATE OR REPLACE FUNCTION A_Test(
      2                 orType varchar2
      3         )RETURN SYS_REFCURSOR
      4         is
      5                type_cur SYS_REFCURSOR;
      6         BEGIN
      7             OPEN type_cur FOR
      8                     select col1,col2,col3 from testTable ;
      9                   RETURN  type_cur;
     10         END;

    (2)返回table类型的结果集:

    首先定义一个行类型:

    CREATE OR REPLACE TYPE "SPLIT_ARR"  AS OBJECT(nowStr varchar2(18))

    其次以此行类型定义一个表类型:

    CREATE OR REPLACE TYPE "SPLIT_TAB" AS TABLE of split_arr;

    定义函数(此函数完成字符串拆分功能):

      1 CREATE OR REPLACE FUNCTION GetSubStr(
      2                    str in varchar2, --待分割的字符串
      3                    splitchar in varchar2 --分割标志
      4             )
      5             return split_tab
      6             IS
      7               restStr varchar2(2000) default GetSubStr.str;--剩余的字符串
      8               thisStr varchar2(18);--取得的当前字符串
      9               indexStr int;--临时存放分隔符在字符串中的位置
     10 
     11               v split_tab := split_tab(); --返回结果
     12 
     13             begin
     14                  dbms_output.put_line(restStr);
     15                  while length(restStr) != 0
     16                    LOOP
     17                      <<top>>
     18                      indexStr := instr(restStr,splitchar); --从子串中取分隔符的第一个位置
     19 
     20                      if indexStr = 0 and length(restStr) != 0  then--在剩余的串中找不到分隔符
     21                         begin
     22                           v.extend;
     23                           v(v.count) := split_arr(Reststr);
     24                           return v;
     25                         end;
     26                      end if;
     27 
     28                      if indexStr = 1 then---第一个字符便为分隔符,此时去掉分隔符
     29                         begin
     30                              restStr := substr(restStr,2);
     31                              goto   top;
     32                         end;
     33                      end if;
     34 
     35                      if length(restStr) = 0 or restStr is null then
     36                         return v;
     37                      end if;
     38 
     39                      v.extend;
     40                      thisStr := substr(restStr,1,indexStr - 1); --取得当前的字符串
     41                      restStr := substr(restStr,indexStr + 1);---取剩余的字符串
     42 
     43                      v(v.count) := split_arr(thisStr);
     44                    END LOOP;
     45                  return v;
     46             end;

    在PL/SQL developer中可以直接调用

    cursor strcur is

      select nowStr from Table(GetSubStr('111,222,333,,,',','));

    (3)以管道形式输出:

      1 create type row_type as object(a varchar2(10), v varchar2(10));--定义行对象
      2         create type table_type as table of row_type; --定义表对象
      3         create or replace function test_fun(
      4             a in varchar2,b in varchar2
      5         )
      6         return table_type pipelined
      7         is
      8             v row_type;--定义v为行对象类型
      9         begin
     10           for thisrow in (select a, b from mytable where col1=a and col2 = b) loop
     11             v := row_type(thisrow.a, thisrow.b);
     12             pipe row (v);
     13           end loop;
     14           return;
     15         end;
     16         select * from table(test_fun('123','456'));






    ORACLE函数Function返回数据集合

    注:本文来源于《       ORACLE函数Function返回数据集合  》

      1 --Oracle中的Function可以返回自定义的数据集,记录参考如下:
      2 
      3 --1,Object对象
      4 /*自定义类型 OBJECT Type*/
      5 CREATE OR REPLACE TYPE EMP_ID_TYPE AS OBJECT(org_cd varchar2(10));
      6 
      7 --2,Table对象
      8 /*自定义类型 TABLE Type*/
      9 CREATE OR REPLACE TYPE EMP_ID_TABLE  AS TABLE of EMP_ID_TYPE;
     10 
     11 --3,编写Function
     12 
     13 CREATE OR REPLACE FUNCTION F_EMP_LIST ()
     14 
     15 RETURN EMP_ID_TABLE PIPELINED IS
     16 
     17  CURSOR emp_list_cursor is
     18             select  '20001' as emp_id from dual union
     19             select  '20002' as emp_id from dual union
     20             select  '20003' as emp_id from dual;
     21 
     22     v_emp_id_type EMP_ID_TYPE;   --Object对象
     23     v_emp_id varchar2(5);              --临时变量
     24 
     25 BEGIN
     26 
     27      OPEN emp_list_cursor;
     28           loop
     29 
     30               fetch emp_list_cursor into v_emp_id;
     31               exit when emp_list_cursor%notfound;
     32 
     33               v_emp_id_type := EMP_ID_TYPE(v_emp_id);  --取值
     34               PIPE ROW(v_emp_id_type);   --管道
     35 
     36           end loop;
     37       CLOSE emp_list_cursor;
     38 
     39       return;
     40 
     41 END;
     42 
     43 --3,测试SQL
     44 
     45 select * from table(F_EMP_LIST);







    Oracle 使用函数 function查询数据返回游标

    注:本文来源于: 《  Oracle 使用函数 function查询数据返回游标   》

       1 create or replace function test111(itemNumber in varchar2) return SYS_REFCURSOR
      2  is
      3   return_cursor SYS_REFCURSOR;
      4 begin
      5    OPEN return_cursor FOR SELECT 'a' FROM dual WHERE 1 = itemNumber;
      6   RETURN return_cursor;
      7 
      8 end test111;

    使用如下sql返回 游标,在pl sql developer可以直接点开查询结果

      1 select test111(1) from dual;
    1. 适用条件: 在Sql语句过长时可以适用,避免在java代码中有过长的sql代码! 

    jdbc调用结果集

      1 package com.dahuatech.job;
      2 
      3 import java.sql.CallableStatement;
      4 import java.sql.Connection;
      5 import java.sql.DriverManager;
      6 
      7 import oracle.jdbc.driver.OracleResultSet;
      8 import oracle.jdbc.driver.OracleTypes;
      9 
     10 public class Test {
     11 
     12     public static void main(String[] args) throws Exception {
     13         Class.forName("oracle.jdbc.driver.OracleDriver");
     14         String url = "jdbc:oracle:thin:@10.30.5.106:1521:agile9";
     15 
     16         Connection conn = DriverManager.getConnection(url, "agile", "***");
     17 
     18         String sql =  "{? = call test111(?)}";
     19         CallableStatement cst = conn.prepareCall(sql);
     20         cst.registerOutParameter(1, OracleTypes.CURSOR);
     21         cst.setString(2, "1");
     22         cst.execute();
     23         OracleResultSet rs = (OracleResultSet) cst.getObject(1);
     24         while (rs.next()) {
     25             System.out.println(rs.getString("a"));
     26         }
     27     }
     28 
     29 }


    SpringMvc框架的jdbcTemplete调用返回为字符串的函数

      1 public String transf(final String inModel) {
      2         return jdbcTemplate.execute("{? = call transfModel(?)}", new CallableStatementCallback<String>() {
      3 
      4             @Override
      5             public String doInCallableStatement(CallableStatement cs)
      6                     throws SQLException, DataAccessException {
      7                 cs.registerOutParameter(1, OracleTypes.VARCHAR);
      8                 cs.setString(2, inModel);
      9                 cs.execute();
     10                 return (String) cs.getObject(1);
     11             }
     12 
     13         });
     14     }

  • 相关阅读:
    [C#]mouse_event模拟点击时坐标参数无效?!
    体验boost::spirit
    喜讯,公司换宽屏液晶显示器了
    [疑难杂症]扩展AxWebBrowser的问题???
    VS 2005 BUG: 新增JScript文件编码问题引起乱码?
    在JavaScript中实现命名空间
    [C#]实现序列号生成器
    基于Web的仿WF工作流设计器
    分享:基于UDP协议实现可靠的数据传输
    远程控制之屏幕截取 小结
  • 原文地址:https://www.cnblogs.com/ios9/p/8374795.html
Copyright © 2011-2022 走看看