我試圖通過遵循Tony Andrews example來實現表函數。但是我的Sql語句會長几行(> 20),並且還會包含參數。是否有可能將Sql語句封裝在其他地方,並從主函數引用它來保持所有內容的可讀性?爲了更好的可讀性,Sql語句是否可以封裝到子函數中?
在傳統的編程語言中,我會將原始Sql分配給一個字符串,並根據需要替換參數。
我試圖通過遵循Tony Andrews example來實現表函數。但是我的Sql語句會長几行(> 20),並且還會包含參數。是否有可能將Sql語句封裝在其他地方,並從主函數引用它來保持所有內容的可讀性?爲了更好的可讀性,Sql語句是否可以封裝到子函數中?
在傳統的編程語言中,我會將原始Sql分配給一個字符串,並根據需要替換參數。
通過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;
是的,你可以:
--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。
非常感謝。這不完全是我做這件事的原因,因爲很多字符串連接。但是你的答案引導我成爲遊標。 – 2011-03-09 10:24:27
20線不是很長,但你總是隱藏視圖背後的查詢。 (只是不要在視圖上堆疊幾層視圖)。 – Ronnis 2011-03-08 21:22:00
事實上,我試圖首先使用視圖,但與參數化的Sql相比,它的速度較慢。正因爲如此,我選擇編寫一個函數:-) – 2011-03-08 21:51:53
請參閱** what **主函數。您應詳細說明您希望如何使用該語句(或通過執行該語句返回的數據),因爲在當前形式下該問題是無法回答的。 – jachguate 2011-03-08 23:29:27