Oracle中函数/过程返回结果集的几种方式
注:本文来源于:《 Oracle中函数/过程返回结果集的几种方式 》
Oracle中函数/过程返回结果集的几种方式:
以函数return为例,存储过程只需改为out参数即可,在oracle 10g测试通过.
(1) 返回游标:
return的类型为:SYS_REFCURSOR
之后在IS里面定义变量:curr SYS_REFCURSOR;
最后在函数体中写:
open cur for
select ......;
return cur;
例:
(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可以直接点开查询结果
- 适用条件: 在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 }