从PL/SQL块运行SCRIPT

G.S*_*G.S 3 oracle plsql prompt

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

我想用这样的东西

declare
begin
   proc(para1,para2);
   execute immediate 'start prompt1' ; 
end;
/
Run Code Online (Sandbox Code Playgroud)

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

APC*_*APC 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以来一直存在的令人尊敬的解决方案. 了解更多.
  2. 在10g中,Oracle用DBMS_SCHEDULER替换DBMS_JOB.此工具的增强功能之一是它能够运行外部作业,即shell脚本.了解更多.
  3. 由于Oracle 11g R1外部表支持预处理器脚本,因此在查询表之前运行shell命令.了解更多.

请注意,所有这些选项都需要提升访问权限(DIRECTORY对象上的授予,安全凭证等).这些只能由特权用户(即DBA)授予.除非我们的数据库具有令人惊讶的宽松安全配置,否则我们无法从PL/SQL运行任意shell脚本.


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

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

begin
   proc(para1,para2);
end;
/   
@prompt1.sql
Run Code Online (Sandbox Code Playgroud)


小智 5

您可以在 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;
    /
Run Code Online (Sandbox Code Playgroud)