利用modplsql使用靈活的參數傳遞
2024-07-21 02:34:43
供稿:網友
Oracle支持將modplsql Apache模塊作為Apache Web服務器和數據庫PL/SQL包過程之間的主接口。
有時候在modplsql的約束下工作是可能會比較困難。它在服務器端Web開發平臺強迫參數的數量、類型和每個參數名字。由于PL/SQL語言的是強類型的并且是基于參數的個數和類型.過載(overload)的,所以它就成了一個限制。
例如,假如你對modplsql模塊發出一個Web請求foo?a=1&b=2,那么modplsql引擎就會尋找匹配簽名foo(a,b)的PL/SQL過程。假如你再添加一個參數&c=3,查找就會失敗并返回一個400錯誤。假如你試圖傳入名字一樣的多個變量(典型的使用復選框的情況),比如說a=2&b=3,查找就會失敗,除非a是對一個數組類型的映射。
Modplsql的開發人員已經意識到了這個限制,在嚴格匹配之外又添加了指定靈活參數傳遞的能力。假如需要請求modplsql完成靈活參數傳遞,在過程名的前面加一個贊嘆號(!)即可。這樣就會告訴modplsql首先尋找帶兩個參數的方法,然后是老的那個四參數的方法,其中所有的參數都通過數組傳遞,例如:
create or replace PRocedure flex2
(
name_arrayowa_util.vc_arr,
value_arrayowa_util.vc_arr
)
is
begin
htp.p('<ul>');
for i in 1..name_array.count loop
htp.p('<li>'name_array(i)'='value_array(i)'</li>');
end loop;
htp.p('</ul>');
end;
/
show errors;
假如你指定類似http://myhost:7777/pls/scott/flex2?a=1&b=2&b=3&c=4....的URL的話,這個過程就會被調用。Name_array由數組a、b、b、c填充;在這里是由1、2、3、4填充的。你實際上可以用任何TABLE OF…數組作為一個參數而不僅限于這里所指定的這些。
老的四參數格式只有在新數據庫中沒有發現兩參數格式的時候才會用到,但是由于向后兼容的原因它依然被支持:
create or replace procedure flex4
(
num_entries number,
name_array in owa_util.vc_arr,
value_array in owa_util.vc_arr,
reserved in owa_util.vc_arr
)
is
begin
htp.p('<ul>');
for i in 1..num_entries loop
htp.p('<li>'name_array(i)'='value_array(i)'</li>');
end loop;
htp.p('</ul>');
end flex4;
/
show errors;