Oracle 从PL/SQL块运行脚本
如何在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/
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或定制前端调用存储过程)完成
话虽如此,在现实世界中,我们使用的是凌乱的体系结构,数据库和外部操作系统之间相互依赖。那么我们能做什么呢
最后,不清楚在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;
/