这里对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 :(得分: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'));