如何在pl / sql块中使用“START SCRIPT”?
我想用这样的东西
declare
begin
proc(para1,para2);
execute immediate 'start prompt1' ;
end;
/
另外我想知道,我可以从prompt1获取一个值到我调用脚本的PL / SQL块吗?因为我需要使用该值在PL / SQL块中执行某些操作。
答案 0 :(得分:9)
这是 2012 2017.脚本是上个千年的笨拙和脆弱的宿醉。 Oracle具有我们可以在PL / SQL中执行的一系列功能,还有Java存储过程,以及启动作业的安排。除了运行DDL来创建或修改模式之外,Oracle数据库环境中几乎不需要脚本;甚至DDL脚本也应该从外部客户端触发,可能是TeamCity等构建工具。
特别是我会考虑尝试从PL / SQL程序运行SQL脚本作为架构故障。你用脚本做了什么,你不能用存储过程做什么?
至于将输入传递给存储过程,这就是参数的用途。 PL / SQL不是交互式的,我们需要客户端输入值。根据情况,这可以异步完成(文件或表中的值)或同步(从SQL * Plus,SQL Developer或定制的前端调用存储过程)。
说了这么多,在现实世界中,我们使用数据库和外部操作系统之间具有相互依赖性的混乱架构。那么我们能做些什么呢?
请注意,所有这些选项都需要提升访问权限(授予DIRECTORY对象,安全凭据等)。这些只能由特权用户(即DBA)授予。除非我们的数据库具有令人惊讶的宽松安全配置,否则我们无法从PL / SQL运行任意shell脚本。
最后,目前尚不清楚您在PL / SQL中运行SQL脚本会带来什么好处。请记住,PL / SQL在数据库服务器上运行,因此它无法在客户端计算机上看到脚本。鉴于接受用户输入的要求,这似乎是相关的。
也许最简单的解决方案是重新配置原始脚本。将必要的PL / SQL调用拆分为一个块,然后只需调用命名脚本:
begin
proc(para1,para2);
end;
/
@prompt1.sql
答案 1 :(得分:4)
您可以在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;
/
答案 2 :(得分:2)
如果您正在使用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>
答案 3 :(得分:1)
另一种做法是在一个*.bat
上使用参数执行,例如:
示例c:/oracle/bin/sqlplus.exe -w @c:/ name
sql%1%2 @c:/output.sql
答案 4 :(得分:0)
立即执行'start prompt1';
执行立即执行SQL语句,而不是任意命令。
我可以从prompt1获取一个值到我调用脚本的PL / SQL块
您可以运行运行脚本 - 但我怀疑您是否可以捕获来自SQL脚本的输入,尤其是PL / SQL块中的输入