oracle - 从 PL/SQL block 运行 SCRIPT

标签 oracle plsql prompt

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

我想使用这样的东西

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

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

最佳答案

现在是2012 2017 年。脚本是上个千年的笨重而脆弱的遗留物。 Oracle 拥有一系列出色的功能,我们可以在 PL/SQL 中执行,此外还有 Java 存储过程,以及启 Action 业的调度。除了运行 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 .

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

<小时/>

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

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

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

关于oracle - 从 PL/SQL block 运行 SCRIPT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8830427/

相关文章:

java - 如何在 Oracle 10g Java VM 中设置并发调用

bash - 在 bash 提示符下倒退

C#,它有提示框吗?

sql - 在 Oracle 中使用什么来编写和编辑存储过程?

sql - 左外连接与子查询?

oracle - Oracle 11gR2 中使用条件的多次更新

command - 在命令提示符下启动程序只会打开另一个命令提示符窗口

sql-server - 尝试从 Pentaho 写入十进制 (38,0) 类型的 Sql Server 列时出现溢出异常

sql - 使用sql Developer从oracle读取xml标签值

java - 将可变参数从 Java 代码传递到 SQL 或 PL/SQL