设为首页 收藏本站
查看: 1469|回复: 0

[经验分享] oracle自定义函数返回结果集

[复制链接]

尚未签到

发表于 2017-12-11 09:36:30 | 显示全部楼层 |阅读模式
  首先要弄两个type,不知道什么鬼:
  1.
  

create or replace type obj_table as object  
(
  
id
varchar2(38),  
name
varchar2(4000),  

count varchar2(10)  
)
  

  2.
  

create or replace type t_table is table of obj_table  

  函数体:
  

create or replace function getStationListTb(s number)  

return t_table  

as  
rs t_table:
= t_table();  

str varchar2(4000);  
i
number := 0;  

begin  
for c in (select DepartmentId from sys_department) loop
  
str := '';
  
i := 0;
  
for c2 in (select t2.name from sys_departmentstation t1
  
left join bsd_station t2 on t1.stationid=t2.stationid where t1.DepartmentId=c.departmentid) loop

  
str := str || '<span>  
i := i + 1;
  
end loop;
  
str := substr(str,0,length(str)-1);
  
rs.extend;
  
rs(rs.count) := obj_table(c.departmentid,str,to_char(i));
  
end loop;
  
return rs;
  
end getStationListTb;
  

  好奇怪的,这个函数我不定义参数它就出错,稍微哪里写错一点东西,就报错,又没提示哪里错,感觉好难写的;这次难得写成功了,赶紧记录下来,下次直接过来copy。
  调用:
  

select * from table(getStationListTb(1))  

DSC0000.png

  那么,这个函数出来就是一张表了,可以把它看成表去使用:
  

SELECT t1.*,t2.name StationList,t2.count StationCount FROM SYS_Department t1  

left join (select * from table(getStationListTb(1))) t2 on t1.DepartmentId=t2.id  

WHERE 1=1  

  先前还写了个按照ID去获取每行数据的:
  

create or replace function getStationList(DepartmentId  VARCHAR2) return VARCHAR2  
as
  
--定义变量
  
resultStr VARCHAR2(8000);
  
begin
  
for c in (select stationid
  
from sys_departmentstation
  
where DepartmentId=DepartmentId) loop
  
resultStr := resultStr || c.stationid || ',';
  
end loop;
  
return substr(resultStr,0,length(resultStr)-1);
  
end getStationList;
  

  想这样直接根据ID关联数据:
  

SELECT t1.*,getStationList(t1.DepartmentId) StationList FROM SYS_Department t1  

  结果出来呵呵的,完全不像sql那样会根据每行的DepartmentId去传参执行getStationList(DepartmentId VARCHAR2)函数,而是一直使用第一行的DepartmentId进行传参:
DSC0001.png

  呵呵。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-422885-1-1.html 上篇帖子: 怎样利用JDBC连接并操作Oracle数据库 下篇帖子: 在Window下安装Oracle
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表