Oracle Sqlplus 在循环中重复调用 sql 脚本

Oracle Sqlplus calling sql script repeatedly in a loop

是否可以通过 sqlplus 在循环内调用脚本?

假设我们有两个文件 simple_sample.sqlmain.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