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

时间:2018-07-24 05:31:47

标签: oracle loops sqlplus

是否可以通过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

1 个答案:

答案 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