是否可以通过sqlplus在循环内调用脚本?
假设我们有两个文件simple_sample.sql
和main.sql
:
|simple_sample.sql|
PROMPT HELLO &1
-------------------
|main.sql|
begin
for loop_parameter in 1..3 loop
#magic_call# @simple_sample.sql loop_parameter
end loop;
end;
/
什么可以代替#magic_call#
来获得此输出:
sqlplus user/password@schema @main.sql
HELLO 1
HELLO 2
HELLO 3
答案 0 :(得分:2)
=== PL / SQL ===
1.1 您可以从PL / SQL调用另一个脚本,但是该脚本将内插在代码中,并且必须是正确的PL / SQL代码段。 因此,如果我们修改原始脚本
simple_sample1.sql
dbms_output.put_line(&1);
main.sql
begin for loop_parameter in 1..3 loop @simple_sample1.sql loop_parameter end loop; end; /
然后结果是
SQL> @main
old 3: dbms_output.put_line(&1);
new 3: dbms_output.put_line(loop_parameter);
1
2
3
PL/SQL procedure successfully completed.
当然,如果用“ begin”和“ end”包装内联代码,则内联代码可能看起来几乎像独立代码块。
begin
dbms_output.put_line(&1);
end;
1.2 如果要从PL / SQL运行任意脚本,则可以使用DBMS_SCHEDULER从PL / SQL代码运行sqlplus,但这有点奇怪,不是吗?我希望不用说脚本将在DBMS_SCHEDULER创建的另一个会话中执行。
=== SQL ===
2。。您也可以将代码内联到SQL中,但是,再次,查询必须在内联后编译。
hello.sql
'HELLO' || ' ' ||
SQL> select
2 @hello.sql
3 rownum
4 from dual
5 connect by rownum <= 3;
HELLO 1
HELLO 2
HELLO 3
SQL>
SQL> select
2 #START hello.sql
3 rownum
4 from dual
5 connect by rownum <= 3;
HELLO 1
HELLO 2
HELLO 3
=== SPOOL ===
3。。最后,您可以循环生成所需的内容,对其进行后台处理并执行。 您可以使用SQL或PL / SQL生成脚本。下面的示例显示了SQL方法。
main_spool.sql
set echo off; set pagesize 0; spool tmp.sql select '@simple_sample.sql' || ' ' || rownum x from dual connect by rownum <= 3; spool off @tmp.sql
SQL> @main_spool
@simple_sample.sql 1
@simple_sample.sql 2
@simple_sample.sql 3
HELLO 1
HELLO 2
HELLO 3