首先要弄兩個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 class="btn btn-defaut select-btn select-site-wrap" title="' || c2.name || '">' || c2.name || '</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))
那么,這個函數出來就是一張表了,可以把它看成表去使用:
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進行傳參:
呵呵。