【问题标题】:Oracle: dynamically select scriptOracle:动态选择脚本
【发布时间】:2013-05-09 05:41:33
【问题描述】:

如何在 SQLPlus 中运行路径名以字符串形式传递的脚本。类似于以下内容(失败):

SET SERVEROUTPUT ON;
DECLARE
   path VARCHAR2(128);
BEGIN
   path := '<runtime_path>' || 'test_script.sql';
   dbms_output.put_line(path);
   @ path;
END;
/

【问题讨论】:

  • 为什么要在 Oracle 中运行它?如果必须是脚本,为什么不使用调度程序?如果它不必是脚本,则将其放在包/过程中并在数据库中安排它。在回答您的问题时,您 可以 将其读入 clob 并使用 dbms_sql 执行......尽管对于应该是一个简单的过程或 cron 调用来说,这似乎是一个巨大的过度杀伤力。
  • @Ben,这是一个开发环境。我们有数百个来自外部团队的单行 DDL 脚本,它们构建了用于验证测试另一个软件组件的模式。
  • 我还是不知道你为什么需要在Oracle中做。如果你有数百个,那么将它们全部放在一个 shell 脚本中并运行它;你可以用一行来执行它们,如果你愿意的话,可以明智地使用grepawk......
  • @Ben,目前脚本列表嵌入在前面有@ 的另一个sql 脚本中,该脚本具有错误报告和其他常见设置。所以,我想实际选择嵌套脚本的路径。
  • ThomasMcleod:你是在 unix 还是 windows 上?

标签: oracle plsql oracle11g sqlplus sql-scripts


【解决方案1】:

您可以将参数传递给 SQLPlus,但不能将 PL/SQL 与 SQLPlus 命令混合使用。所以你的例子不会飞。所以你可能需要用一个 shell 脚本来包装它。但是当我查看您的 PL/SQL 例程时,您只需尝试添加路径。也许这是可能的。

这样调用sqlplus

sqlplus user/password@database @genericscript.sql path

然后在 genericscript.sql 中

SET SERVEROUTPUT ON
start &1.myscript.sql
quit

在我的示例中,myscript.sql 包含此内容

select 'hello welt' from dual;

所以我从 SQLPlus 得到以下输出

[oracle@localhost sqp]$ sqlplus user/pw@db @genericscript.sql /home/oracle/sqp/

SQL*Plus: Release 11.2.0.2.0 Production on Tue May 14 22:53:15 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options


'HELLOWELT
----------
hello welt

Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.2.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

希望对您有所帮助。您可以查看 SQLPLUS 参考手册。

http://docs.oracle.com/cd/E11882_01/server.112/e16604/ch_five.htm#autoId13

我更喜欢 PDF

http://docs.oracle.com/cd/E11882_01/server.112/e16604.pdf

【讨论】:

  • 这在技术上并不能回答这个问题......如果有数百个我怀疑 OP 可能想要自动执行它,根据评论 “所以,我想实际选择嵌套脚本的路径。”
  • @Ben 你是对的,我正在检查是否有机会将 SQLPLUS 命令与 PL/SQL 混合,但没有。所以我会澄清这一点。
  • 嗯,&amp;1. 只是在参数前面加上?我想知道额外的.
  • @ThomasMcLeod - . 只是分隔替换变量,因此 SQL*Plus 知道 1 是变量,myscript.sql 是固定字符串。否则,如果您有&amp;1myscript.sql,那么&amp; 之后的所有内容是否都是变量名将是模棱两可的。这对于命名变量而不是位置变量更有意义。 (另见this recent answer :)
  • 他的榜样会飞起来。请看下面我的回答
【解决方案2】:

一个选项:

D:\>type run.sql
col p new_value path noprint
select '&1.' as p from dual
/

@&path
D:\>type run1.sql
select 'This is run1' from dual
/
D:\>sqlplus hr/hr@sandbox @run.sql d:\run1.sql

SQL*Plus: Release 11.2.0.1.0 Production on Wed May 15 13:24:22 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production




Elapsed: 00:00:00.03

'THISISRUN1'
------------
This is run1

Elapsed: 00:00:00.01

你也可以在匿名块中内联脚本,非常方便:

D:\>sqlplus hr/hr@sandbox @parent.sql d:\child.sql

SQL*Plus: Release 11.2.0.1.0 Production on Wed May 15 13:31:46 2013

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

currently spooling to S:\spool\sandbox\20130515_1331_HR_33.log
this is child script called from parent's anonymous plsql block
child's name was passed using command line parameter

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
13:31:47 HR@sandbox> get parent
  1  begin
  2  @&1.
  3* end;
13:31:48   4  .
13:31:48 HR@sandbox> get child
  1  dbms_output.put_line('this is child script called from parent''s anonymous plsql block');
  2* dbms_output.put_line('child''s name was passed using command line parameter');
13:31:50 HR@sandbox>

【讨论】:

    【解决方案3】:

    我在 Windows 上的做法是创建一个 BAT 文件,其中包含:

    sqlplus my_username/my_password@tns.test.company.com %*
    

    然后在命令提示符下,要执行文件的 SQL 内容,我只需键入:

    batfile.bat @myfile.sql
    

    【讨论】:

    • OP 使用的是 Linux……但同样适用于 shell 脚本。它在技术上也没有回答这个问题......如果有数百个我怀疑 OP 可能想要自动执行它,根据评论“所以,我想实际选择嵌套脚本的路径”。 – Ben 刚刚编辑
    • 我刚刚在发布后看到了 Linux 评论,但决定留下我的答案,以便其他人可以窃取这个想法并给出更好的答案:)
    【解决方案4】:

    从 PL/SQL 运行可执行文件的唯一方法是动态创建 EXECUTABLE 类型的 EXECUTABLE 并安排作业。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多