Oracle Sqlplus循环重复调用sql脚本

标签 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

最佳答案

===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/

相关文章:

oracle - oracle死锁无法回滚吗?

oracle - 从 SYS_CONTEXT/USERENV 读取所有参数

r - 循环多个表并仅在满足条件时才保留的方法?

oracle - 安装Oracle 11g后连接到SQL * Plus时应输入什么用户名和密码?

Oracle:将角色从一个数据库复制到另一个数据库?

sql - 列在 Oracle PL-SQL 中定义不明确

java - 数据加载期间表中的 SQL 动态列处理

sql - 优化Oracle order by query

mysql - 从 X.X+1、X+2、X+3、X+4 等返回每个第二窗口中记录的第一条记录

php - 我想通过循环创建数组并计算该数组中的相同值