2013-07-17 57 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'));