如何在 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 或定制前端调用存储过程)。
<小时/> 话虽如此,在现实世界中,我们使用的是困惑的架构,数据库和外部操作系统之间存在相互依赖关系。那么我们能做什么呢?- 我们可以编写一个Java存储过程来执行shell命令。这是古老的解决方案,自 Oracle 8i 以来一直存在。 Find out more .
- 在 10g Oracle 中,用 DBMS_SCHEDULER 替换 DBMS_JOB。该工具的一个增强功能是它能够运行外部作业,即 shell 脚本。 Find out more .
- 自 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/