Oracle中函数/过程返回结果集的几种方式
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 }
为人:谦逊、激情、博学、审问、慎思、明辨、 笃行
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/
学问:纸上得来终觉浅,绝知此事要躬行
为事:工欲善其事,必先利其器。
态度:道阻且长,行则将至;行而不辍,未来可期
.....................................................................
------- 桃之夭夭,灼灼其华。之子于归,宜其室家。 ---------------
------- 桃之夭夭,有蕡其实。之子于归,宜其家室。 ---------------
------- 桃之夭夭,其叶蓁蓁。之子于归,宜其家人。 ---------------
=====================================================================
* 博客文章部分截图及内容来自于学习的书本及相应培训课程以及网络其他博客,仅做学习讨论之用,不做商业用途。
* 如有侵权,马上联系我,我立马删除对应链接。 * @author Alan -liu * @Email no008@foxmail.com
转载请标注出处! ✧*꧁一品堂.技术学习笔记꧂*✧. ---> https://www.cnblogs.com/ios9/