0

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

非常感谢您对此的任何帮助。

4

2 回答 2

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;
于 2013-07-17T16:06:54.970 回答
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'您的参数值):

select *
from table(reject_list('xxx', 'yyy'));
于 2013-07-17T19:36:39.010 回答