从查询创建PL / SQL函数

时间:2013-07-17 16:01:18

标签: html sql oracle function plsql

这里对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表格。我现在已经将标记添加到上面的查询中,并且所有字段都需要连接。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

您可能必须使用游标遍历select语句的结果。请考虑以下代码作为指南。 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;

答案 1 :(得分: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;
/

之后你可以这样使用这个功能(在你的param的值上更改'xxx''yyy'):

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