从PL / SQL块运行SCRIPT

时间:2012-01-12 05:12:14

标签: oracle plsql prompt

如何在pl / sql块中使用“START SCRIPT”?

我想用这样的东西

declare
begin
   proc(para1,para2);
   execute immediate 'start prompt1' ; 
end;
/

另外我想知道,我可以从prompt1获取一个值到我调用脚本的PL / SQL块吗?因为我需要使用该值在PL / SQL块中执行某些操作。

5 个答案:

答案 0 :(得分:9)

这是 2012 2017.脚本是上个千年的笨拙和脆弱的宿醉。 Oracle具有我们可以在PL / SQL中执行的一系列功能,还有Java存储过程,以及启动作业的安排。除了运行DDL来创建或修改模式之外,Oracle数据库环境中几乎不需要脚本;甚至DDL脚本也应该从外部客户端触发,可能是TeamCity等构建工具。

特别是我会考虑尝试从PL / SQL程序运行SQL脚本作为架构故障。你用脚本做了什么,你不能用存储过程做什么?

至于将输入传递给存储过程,这就是参数的用途。 PL / SQL不是交互式的,我们需要客户端输入值。根据情况,这可以异步完成(文件或表中的值)或同步(从SQL * Plus,SQL Developer或定制的前端调用存储过程)。


说了这么多,在现实世界中,我们使用数据库和外部操作系统之间具有相互依赖性的混乱架构。那么我们能做些什么呢?

  1. 我们可以编写Java存储过程来执行shell命令。这是自Oracle 8i以来一直存在的令人尊敬的解决方案。 Find out more
  2. 在10g Oracle中用DBMS_SCHEDULER替换DBMS_JOB。此工具的增强功能之一是它能够运行外部作业,即shell脚本。 Find out more
  3. 由于Oracle 11g R1外部表支持预处理器脚本,后者在查询表之前运行shell命令。 Find out more
  4. 请注意,所有这些选项都需要提升访问权限(授予DIRECTORY对象,安全凭据等)。这些只能由特权用户(即DBA)授予。除非我们的数据库具有令人惊讶的宽松安全配置,否则我们无法从PL / SQL运行任意shell脚本。


    最后,目前尚不清楚您在PL / SQL中运行SQL脚本会带来什么好处。请记住,PL / SQL在数据库服务器上运行,因此它无法在客户端计算机上看到脚本。鉴于接受用户输入的要求,这似乎是相关的。

    也许最简单的解决方案是重新配置原始脚本。将必要的PL / SQL调用拆分为一个块,然后只需调用命名脚本:

    begin
       proc(para1,para2);
    end;
    /   
    @prompt1.sql
    

答案 1 :(得分:4)

您可以在SqlPlus中编写一个pl / sql块来检查表中的参数然后执行脚本。在要执行的脚本(下面的MyScript.sql)中,语句终止符必须是“;”而不是“/”

    declare
    vMyParameter number := 0;  
    begin

    select count(*) into vMyParameter
    from MyTable
    where MyCheckValue = 'Y';

    if vMyParameter = 1 then
    @MyFolder/MyScript.sql;

    end if;
    end;
    /

答案 2 :(得分:2)

如果您正在使用sql * plus(或使用它的工具),那么您可以执行以下操作:

set serveroutput on
variable a number;
begin
:a := &promt;
dbms_output.put_line(:a);
end;
/

如果它是批量运行,那么你可以这样做:

variable a number;
begin
:a := &1;
dbms_output.put_line(:a);
end;

并获取:a作为参数的值 -

sqlplus sdad/fdsfd@fdggd @<your_script.sql> <val_for_a>

答案 3 :(得分:1)

另一种做法是在一个*.bat上使用参数执行,例如:

  

示例c:/oracle/bin/sqlplus.exe -w @c:/ name

     

sql%1%2 @c:/output.sql

答案 4 :(得分:0)

  

立即执行'start prompt1';

执行立即执行SQL语句,而不是任意命令。

  

我可以从prompt1获取一个值到我调用脚本的PL / SQL块

您可以运行运行脚本 - 但我怀疑您是否可以捕获来自SQL脚本的输入,尤其是PL / SQL块中的输入