是否可以通过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”包装内联代码,它可能看起来几乎像独立 block 。
begin
dbms_output.put_line(&1);
end;
1.2 如果您想从 PL/SQL 运行任意脚本,您可以使用 DBMS_SCHEDULER 从 PL/SQL 代码运行 sqlplus...但这有点奇怪,不是吗?我希望不用说,脚本将在 DBMS_SCHEDULER 创建的另一个 session 中执行。
===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
关于Oracle Sqlplus循环重复调用sql脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51491097/