在Oracle9i中, SQL*Plus现在不仅能接受文件名当作脚本地址,还可以接受HTTP或是FTP地址当作脚本地址来源。举例来说,通过“@http://www.mycorp.com/sql/setup.sql”这条命令就可以从这个网址装载SQL脚本,然后在当前的运行环境下运行。
而“@@”命令能知道它当前正在从一个URL上运行,所以会从相同的位置装载脚本。举例来说,假如上述装载的脚本包含以下代码的话,那么每个SQL脚本将根据给定的URL被装载。
REM - setup script
@@tables.sql
@@indexes.sql
@@code.sql
有些DBA希望集中维护位于一个远程位置并且可以被不同位置的数据库执行的脚本,这对于他们来说是有价值的。这对于那些因没有SQL*Net而不能连接数据库,但能通过HTTP使用脚本的客户是非凡有用的。
通过HTTP协议,脚本可以根据Web服务器的输入参数产生。举例来说,http://www.mycorp.com/cgi-bin/setup.pl?host=bart就将参数host=bart传递给CGI-BIN脚本。SQL *Plus有其单独的参数传递工具。
在脚本被装载之后,这些参数被绑定起来用于定义参数。命令@@tables.sql mytablespace将从相同的相关目录装载“tables.sql”这个脚本,然后mytablespace 将被绑定到SQL * Plus的&1参数上。 对于@URL在功能上有一个差别,那就是.sql扩展是不可选择的
在Oracle8i中模拟@URL
这个特征的一个缺点就是他似乎不支持HTTP代理。脚本只有通过直接的连接才能够被装载。在Oracle8i中的一个变通的通过使用代理进入或者是模拟这个功能实现的脚本如下:
REM -- http_at.sql
set feedback off
set linesize 255
set serveroutput on size 64000
set trimspool on
spool test.sql
declare
l_pieces utl_http.Html_pieces;
l_piece varchar2(2000);
l_url varchar2(2048) := '&1';
l_maxline integer := 255;
l_index integer;
l_stubvarchar2(255);
l_proxy varchar2(2048) := 'proxy.mycomp.com:8000';
begin
l_pieces := utl_http.request_pieces(l_url,1000,l_proxy);
for i in l_pieces.first .. l_pieces.last loop
l_piece := l_pieces(i);
while length(l_piece) l_maxline loop
l_stub := substr(l_piece,1,l_maxline);
l_index := length(l_stub);
while l_index 0 and substr(l_stub,l_index,1) != chr(10) loop
l_index := l_index - 1;
end loop;
l_stub := substr(l_piece,1,l_index-1);
l_piece := substr(l_piece,l_index+1);
dbms_output.put_line(l_stub);
end loop;
dbms_output.put_line(l_piece);
end loop;
end;
/
spool off;