我已经在这个论坛上搜索并通过google搜索了我的问题的答案,但是我找不到针对我的挑战的具体答案。这就是为什么我在这里要求它希望收到你们中一个人的答复。
我想使用多个SQL文件,而一个SQL文件是控制文件,该文件执行带有参数的其他SQL文件。该文件称为:startup.sql
我有一个包含所有值的表格(不要介意列的名称,我在帖子中更改了它们)。
create table control (
S varchar2(15) not null,
N varchar2(25 char) not null,
B varchar2(25 char) not null,
Acheck varchar2(25 char) not null,
Adcheck varchar2(25) not null,
Blu varchar2(25) not null,
ADB varchar2(25)
)
插入以下内容之一的地方(有更多条目,但其中一个足以向您展示工作方式):
insert into control (S,N,B,Acheck,Adcheck,Blu,ADB)
values('Test','B','J','J','N','N', '');
我的控制文件如下所示:
set escape on
set serveroutput on
SET DEFINE ON
declare
cursor c_lees_control is
select S, N, B, Acheck, Adcheck, Blu, ADB
from control
v_s varchar2(30);
v_b varchar2(30);
v_blu varchar2(30);
begin
for r_lees_control in c_lees_control
loop
v_s := r_lees_control.S;
v_b := r_lees_control.B;
v_blu := r_lees_control.Blu;
if v_b = 'J' then
--Also tried this.
--@C:/Temp/uitvoer.sql $v_s $v_blu
@C:/Temp/uitvoer.sql %v_s% %v_blu%
end if;
end loop;
end;
/
在我的uitvoer.sql中,我有一个像这样的变量:
variable_s := '&&1';
variable_blu := '&&2';
现在正在发生以下情况。我使用所有凭据启动SQL Plus,并启动控制文件(control.sql)。在SQL Plus的输出中说明了以下内容:
old 89: s = '&&1';
new 89: s = '%v_s%';
old 128: b_lu := '&&2';
new 128: b_lu := '%v_blu%';
我期待以下内容:
old 89: s = '&&1';
new 89: s = 'Test';
old 128: b_lu := '&&2';
new 128: b_lu := 'J';
为什么控制文件中的变量没有正确解析为新的SQL文件?
我还发现了以下帖子:如何在sqlplus中使用START传递参数到SQL文件中的PL / SQL块?/从批处理文件(带有参数)启动PL / SQL脚本看起来像我的挑战,但是我不是从批处理文件而是从sql文件调用。
我希望有一个人可以帮助我。如果不清楚,我可以尝试多解释一下。
@
是SQL * Plus命令,在PL / SQL中没有意义。解析时,脚本已包含在PL / SQL块中,您可以查看脚本中list
的代码是否在缓冲区中。在控制块中声明的变量可直接用于“包含”代码,而无需替换。
例如,如果uitvoer.sql
仅包含:
dbms_output.put_line(v_s);
然后这个控制脚本:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
产生:
Test
PL/SQL procedure successfully completed.
1 declare
2 v_s varchar2(10) := 'Test';
3 begin
4 dbms_output.put_line(v_s);
5* end;
缓冲区中的PL / SQL块具有包含的代码,而不是对的引用uitvoer.sql
。但是包含的代码起作用了,因为它引用了仍在范围内的控制脚本中的变量。
如果要允许控制变量使用不同的名称,或者允许uitvoer.sql
更灵活地调用,那么您仍然可以使用替换变量,但是您仍将替换变量名称,而不是其值。例如,使用此代码uitvoer.sql
(请注意,替代变量asgment在其周围没有引号):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
然后您的控制脚本传递变量名称:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
你看:
old 7: variable_s := &&1;
new 7: variable_s := v_s;
Test
PL/SQL procedure successfully completed.
1 declare
2 v_s varchar2(10) := 'Test';
3 begin
4 declare
5 variable_s varchar2(10);
6 begin
7 variable_s := &&1;
8 dbms_output.put_line(variable_s);
9 end;
10* end;
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句