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;