2011-03-08 14 views
1

我試圖通過遵循Tony Andrews example來實現表函數。但是我的Sql語句會長几行(> 20),並且還會包含參數。是否有可能將Sql語句封裝在其他地方,並從主函數引用它來保持所有內容的可讀性?爲了更好的可讀性,Sql語句是否可以封裝到子函數中?

在傳統的編程語言中,我會將原始Sql分配給一個字符串,並根據需要替換參數。

+2

20線不是很長,但你總是隱藏視圖背後的查詢。 (只是不要在視圖上堆疊幾層視圖)。 – Ronnis 2011-03-08 21:22:00

+0

事實上,我試圖首先使用視圖,但與參數化的Sql相比,它的速度較慢。正因爲如此,我選擇編寫一個函數:-) – 2011-03-08 21:51:53

+0

請參閱** what **主函數。您應詳細說明您希望如何使用該語句(或通過執行該語句返回的數據),因爲在當前形式下該問題是無法回答的。 – jachguate 2011-03-08 23:29:27

回答

0

通過drapkin11啓發我found使用遊標的解決方案:

CREATE OR REPLACE Function TotalIncome(name_in IN varchar2) 
RETURN varchar2 
IS 
    total_val number(6); 

    cursor c1 is 
     select monthly_income 
     from employees 
     where name = name_in; 

BEGIN 
    total_val := 0; 
    FOR employee_rec in c1 
    LOOP 
     total_val := total_val + employee_rec.monthly_income; 
    END LOOP; 
    RETURN total_val; 
END; 
2

是的,你可以:

--declare variables 
TYPE curref is REF CURSOR; 
c1 curref; 

q VARCHAR2(2000); 

--save query to string variable 
q:='<insert 20 line query here>'; 

--open cursor 
OPEN c1 FOR q; 

--then, work on cursor rows, one by one 

注意, 'Q' 可以說是相當複雜的,具有級聯的參數值(或子查詢,可存儲作爲單獨的VARCHAR變量):

q:=' 
    select distinct 
     fn.BASENAME as name 
     ,h.PARENT_ID as "admin_place_id" 
     ,h.lev as "admin_level" 
    FROM (
     SELECT CHILD_ID, PARENT_ID, level lev 
     from '||schema||'.NT_ADMIN_GRAPH 
     START WITH CHILD_ID='||q_sub2||' 
     CONNECT BY CHILD_ID=PRIOR PARENT_ID 
    UNION ALL 
     SELECT null, '||q_sub2||', 0 
     FROM DUAL 
    ) h 
    ' 
    ||q_sub|| 
    ' 
    ORDER BY h.lev asc  
'; 

有關如何實現此目的的更多示例,請參見Oracle's documentation

+0

非常感謝。這不完全是我做這件事的原因,因爲很多字符串連接。但是你的答案引導我成爲遊標。 – 2011-03-09 10:24:27

相關問題