create or replace type mytabletype as table of number;
/
create or replace function strtab(p_str in varchar2)
return mytabletype
as
lstr varchar2(1000) default p_str||',';
ln number;
ldata mytabletype:=mytabletype();
begin
loop
ln:=instr(lstr,',');
exit when (nvl(ln,0)=0);
ldata.extend;
ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
lstr:=substr(lstr,ln+1);
end loop;
return ldata;
end;
/
SQL> select * from table(cast(strtab('11,12,13') as mytabletype));
create or replace function fun_yggstjone
(
v_projectId in tp_projectinfo.projectid%type,
v_date1 in tp_dayreport.reportdate%type,
v_date2 in tp_dayreport.reportdate%type,
v_workTypeIds in varchar2
)
return pck_stagzl.sta_cur
is
v_sql varchar2(200);
v_retcur pck_stagzl.sta_cur;
begin
open v_retcur for
select e.projectid,e.userid,e.sum_wamount,f.worktypeid,f.wt_wamount
from (
select projectid,userid,sum(workamount) sum_wamount
from tp_dayreport
where statusflag='1'
and projectid=v_projectId
and reportdate>=v_date1
and reportdate<=v_date2
group by projectid,userid
order by projectid,userid
) e,
(
select c.*,d.wt_wamount
from (
select distinct a.projectid,a.userid,b.worktypeid
from tp_dayreport a,tp_worktype b
where a.statusflag='1'
and a.projectid=v_projectId
and a.reportdate>=v_date1
and a.reportdate<=v_date2
//错误 and b.workTypeId in (v_sql)
order by a.projectid,a.userid,b.worktypeid) c,
(select projectid,userid,worktypeid,sum(workamount) wt_wamount
from tp_dayreport
where statusflag='1'
and projectid=v_projectId
and reportdate>=v_date1
and reportdate<=v_date2
group by projectid,userid,worktypeid
order by projectid,userid,worktypeid) d
where c.projectid=d.projectid(+)
and c.userid=d.userid(+)
and c.worktypeid=d.worktypeid(+)
order by c.projectid,c.userid,c.worktypeid
) f
where e.projectid=f.projectid
and e.userid=f.userid
order by f.projectid,f.userid,f.worktypeid;
return v_retcur;
end fun_yggstjone;
oracle有这样一种方法,可能大家比较少见,现在介绍,让大家分享:
select * from plsql_function
以下是一个例子:
create or replace type mytabletype
as table of number;
/
create or replace function strtab(p_str in varchar2)
return mytabletype
as
lstr varchar2(1000) default p_str||',';
ln number;
ldata mytabletype:=mytalbetype();
begin
loop
ln:=instr(lstr,',');
exit when (nvl(ln,0)=0);
ldata.extend;
ldata(ldata.count):=ltrim(rtrim(substr(lstr,1,ln-1)));
lstr:=substr(lstr,ln+1);
end loop;
return ldata;
end;
/
select * from table(cast(strtab(v_sql) as mytabletype));
s_sql:='select distinct a.projectid,a.userid,b.worktypeid
from tp_dayreport a,tp_worktype b
where a.statusflag='1'
and a.projectid=v_projectId
and a.reportdate>=v_date1
and a.reportdate<=v_date2
and b.workTypeId in ('||v_sql||')';
execute immediate s_sql into ...;
老大,具体怎么用啊,下面是函数内的部分代码
select distinct a.projectid,a.userid,b.worktypeid
from tp_dayreport a,tp_worktype b
where a.statusflag='1'
and a.projectid=v_projectId
and a.reportdate>=v_date1
and a.reportdate<=v_date2
and b.workTypeId in (execute(v_sql)) --这句有问题
order by a.projectid,a.userid,b.worktypeid) c,