Oracle Sqlplus 在循环中重复调用 sql 脚本
Oracle Sqlplus calling sql script repeatedly in a loop
是否可以通过 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
===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 的任意脚本,你可以 运行 来自 PL/SQL 的 sqlplus 代码使用 DBMS_SCHEDULER...但这有点奇怪,不是吗?我希望不用说脚本将在 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
===阀芯===
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
是否可以通过 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
===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 的任意脚本,你可以 运行 来自 PL/SQL 的 sqlplus 代码使用 DBMS_SCHEDULER...但这有点奇怪,不是吗?我希望不用说脚本将在 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
===阀芯===
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