Oracle 从PL/SQL块运行脚本

Oracle 从PL/SQL块运行脚本,oracle,plsql,prompt,Oracle,Plsql,Prompt,如何在pl/sql块中使用“启动脚本” 我想用这样的东西 declare begin proc(para1,para2); execute immediate 'start prompt1' ; end; / 我还想知道,我可以从prompt1中获取一个值到调用脚本的PL/SQL块中吗?因为我需要使用该值来执行PL/SQL块中的一些操作 立即执行“启动提示1” executeimmediate用于执行SQL语句,而不是任意命令 我可以从prompt1中获取一个值到调用脚本的PL/

如何在pl/sql块中使用“启动脚本”

我想用这样的东西

declare
begin
   proc(para1,para2);
   execute immediate 'start prompt1' ; 
end;
/
我还想知道,我可以从prompt1中获取一个值到调用脚本的PL/SQL块中吗?因为我需要使用该值来执行PL/SQL块中的一些操作

立即执行“启动提示1”

executeimmediate用于执行SQL语句,而不是任意命令

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

您可以运行运行脚本-但我怀疑您是否能够从SQL脚本捕获输入,尤其是在PL/SQL块中

如果您使用的是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>
sqlplus-sdad/fdsfd@fdggd @ 
现在是2012年,2017年。脚本是上个千年遗留下来的笨重而脆弱的东西。Oracle有一系列我们可以在PL/SQL中执行的功能,还有Java存储过程,还有启动作业的调度。除了运行DDL来创建或修改模式之外,在Oracle数据库环境中几乎不需要脚本;甚至DDL脚本也应该从外部客户端触发,可能是TeamCity之类的构建工具

特别是,我认为试图从PL/SQL程序运行SQL脚本是一种体系结构故障。对于存储过程无法执行的脚本,您正在执行哪些操作

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


话虽如此,在现实世界中,我们使用的是凌乱的体系结构,数据库和外部操作系统之间相互依赖。那么我们能做什么呢

  • 我们可以编写一个Java存储过程来执行shell命令。这是一个古老的解决方案,自Oracle 8i以来就一直存在
  • 在10g Oracle中,使用DBMS_调度程序替换DBMS_作业。该工具的一个增强功能是能够运行外部作业,即shell脚本
  • 由于Oracle 11g R1外部表支持预处理器脚本,这些脚本在查询表之前运行shell命令 请注意,所有这些选项都需要提升访问权限(授予目录对象、安全凭据等)。这些权限只能由特权用户(即DBA)授予。除非我们的数据库的安全配置非常松散,否则我们无法从PL/SQL运行任意shell脚本


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

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

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

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

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

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


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


    实际上,我有一个合法的需求来做这样的事情(从块中调用sql脚本)。这发生在需要引导和配置一组模式(比如
    bootstram\u schema\u a.sql
    bootstrap\u schema\u B.sql
    )的COTS上。根据条件,我们可能会运行一个或另一个(或一个接一个)这是一种简化,我正在处理的实际情况有点复杂,但当PL/SQL提供了确定要调用哪些脚本以及以何种顺序调用的所有控制结构时,用另一种语言(比如Java或Ant脚本)编写驱动程序似乎有些过火。
        declare
        vMyParameter number := 0;  
        begin
    
        select count(*) into vMyParameter
        from MyTable
        where MyCheckValue = 'Y';
    
        if vMyParameter = 1 then
        @MyFolder/MyScript.sql;
    
        end if;
        end;
        /