代码之家  ›  专栏  ›  技术社区  ›  diziaq

Oracle sqlplus在循环中重复调用SQL脚本

  •  1
  • diziaq  · 技术社区  · 7 年前

    是否可以通过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
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   Dr Y Wit    7 年前

    ===pl/sql===

    一点一 您可以从pl/sql调用另一个脚本,但是 它将在代码中内联,并且必须是正确的pl/sql代码段 . 所以如果我们修改原始脚本

    简单_sample1.sql

    dbms_output.put_line(&1);
    

    主.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;
    

    一点二 如果要从pl/sql运行任意脚本,可以使用dbms_调度程序从pl/sql代码运行sqlplus…但这有点奇怪,不是吗?我希望不用说脚本将在DBMS_调度程序创建的另一个会话中执行。

    ===SQL===

    2。 您也可以将代码内联到SQL中,但是, 必须在内联后编译查询 .

    你好.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并执行它 . 您可以使用SQL或PL/SQL来生成脚本。下面的示例显示了SQL方法。

    主输出轴.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