2013-07-17 60 views
0

这里对PL/SQL知之甚少,所以需要一点帮助。从查询中创建PL/SQL函数

我有一个查询,我需要变成一个函数(让我们称之为reject_list),但不知道如何去做。这是我到目前为止:

create or replace function reject_list(ayrc in varchar2,mcrc in varchar2) 
return string 
begin 
select distinct 
'<tr><td>'||cap.cap_uci2||'</td> 
<td>'||cap.cap_stuc||'</td> 
<td>'||cap.cap_mcrc||'</td> 
<td>'||cap.cap_ayrc||'</td> 
<td>'||stu.stu_fnm1||'</td> 
<td>'||stu.stu_surn||'</td> 
<td>'||cap.cap_stac||'</td> 
<td>'||cap.cap_crtd||'</td></tr>' 
from 
intuit.srs_cap cap 
,intuit.ins_stu stu 
,intuit.srs_apf apf 
where 
cap.cap_stuc = stu.stu_code 
and cap.cap_apfs = apf.apf_seqn 
and cap.cap_stuc = apf.apf_stuc 
and cap.cap_mcrc = &mcrc 
and cap.cap_ayrc = &ayrc 
and cap.cap_idrc in ('R','CR','CFR') 
and apf.apf_recd <= to_date('1501'||substr(&ayrc,1,4),'DDMMYYYY'); 
end; 

这不运行 - 任何人都可以帮忙吗?

谢谢:)

编辑:该查询是一个在应用程序中运行,但已经我们试图去优化它的速度。我不确定函数是否是最好的选择,但是我们在应用程序的另一部分中创建了一个函数来返回简单的计数,从而提高了速度的指数级。我需要的不仅仅是指导如何将其转化为功能的指导。例如,如果一个视图是最好的选择,请让某人提供一些关于如何做到这一点的最佳方法的指导?

因此,该对象应该能够在服务器上存储查询,以便我输入参数并返回列出的字段。为了使这更复杂,我之前没有提到的一件事是,这需要格式化为HTML表格。我现在已经将标记添加到上面的查询中,并且所有的字段都需要连接起来。

对此非常感谢。

+0

你想返回一个游标,不是吗? – tbone

+0

有很多关于你的问题还不清楚。你想让你的函数返回什么? ('字符串'不是一个有效的SQL类型,至少在Oracle中。)为什么你需要把你的查询变成一个函数? (如果只是为了能够在不重复的情况下在多个地方使用相同的查询,那么最好使用视图。)在SQL Server中,存储函数可以返回SELECT查询的结果 - 您是否在寻找Oracle相当于这个? –

+0

请参阅上面所做的编辑。我最初把这个问题放在了一个急促的地方,因此缺乏信息,但请让我知道是否有其他需要澄清的问题。 –

回答

1

您可能必须使用游标循环选择语句的结果。请考虑以下代码作为指导。 http://www.plsql-tutorial.com/plsql-cursors.htm。另外请考虑用P_或类似的东西加前缀你的函数参数。这将使他们更容易在代码中发现。

FUNCTION YOUR_FUNCTION(p_ayrc in varchar2,p_mcrc in varchar2) 
RETURN SYS_REFCURSOR 
    IS 
    THE_RESULT SYS_REFCURSOR; 
    BEGIN 
      OPEN THE_RESULT FOR 
       select distinct 
     cap.cap_uci2 
     ,cap.cap_stuc 
     ,cap.cap_mcrc 
     ,cap.cap_ayrc 
     ,stu.stu_fnm1 
     ,stu.stu_surn 
     ,cap.cap_stac 
     ,cap.cap_crtd 
     from 
     intuit.srs_cap cap 
     ,intuit.ins_stu stu 
     ,intuit.srs_apf apf 
     where 
     cap.cap_stuc = stu.stu_code 
     and cap.cap_apfs = apf.apf_seqn 
     and cap.cap_stuc = apf.apf_stuc 
     and cap.cap_mcrc = p_mcrc 
     and cap.cap_ayrc = p_ayrc 
     and cap.cap_idrc in ('R','CR','CFR') 
     and apf.apf_recd <= to_date('1501'||substr(&ayrc,1,4),'DDMMYYYY'); 
      RETURN THE_RESULT; 
END; 
+0

好的,我认为我现在理解游标的概念,但不确定如何实现它们,并且此语句仍然无法运行。还有什么建议? –

0

尝试是这样的(你只能改变你列的类型varchar(256)):

create type t_row as object 
(
cap_uci2 varchar(256) 
, cap.cap_stuc varchar(256) 
, cap.cap_mcrc varchar(256) 
, cap.cap_ayrc varchar(256) 
, stu.stu_fnm1 varchar(256) 
, stu.stu_surn varchar(256) 
, cap.cap_stac varchar(256) 
, cap.cap_crtd varchar(256) 
); 
/

create type t_tab is table of t_row; 
/

create or replace function reject_list(ayrc varchar2, mcrc varchar2) 
    return t_tab pipelined 
begin 
    for cur in 
    (
    select distinct 
     cap.cap_uci2 
     , cap.cap_stuc 
     , cap.cap_mcrc 
     , cap.cap_ayrc 
     , stu.stu_fnm1 
     , stu.stu_surn 
     , cap.cap_stac 
     , cap.cap_crtd 
    from intuit.srs_cap cap 
     , intuit.ins_stu stu 
     , intuit.srs_apf apf 
    where cap.cap_stuc = stu.stu_code 
     and cap.cap_apfs = apf.apf_seqn 
     and cap.cap_stuc = apf.apf_stuc 
     and cap.cap_mcrc = mcrc 
     and cap.cap_ayrc = ayrc 
     and cap.cap_idrc in ('R', 'CR', 'CFR') 
     and apf.apf_recd <= to_date ('1501' || substr(ayrc, 1, 4), 'DDMMYYYY') 
) 
    loop 
     pipe row(cur); 
    end loop; 
end; 
/

之后,你可以使用函数这种方式(改变'xxx''yyy'您PARAM的值):

select * 
from table(reject_list('xxx', 'yyy'));