Jer*_*der 4 oracle plsql sqlplus
我已经搜索了这个论坛,并通过谷歌搜索我的问题的答案,但我无法找到我的挑战的具体答案.这就是为什么我在这里要求它希望得到你们其中一个人的回答.
我想使用多个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)
)
Run Code Online (Sandbox Code Playgroud)
插入以下其中一个(有更多条目,但一个足以向您显示工作方式):
insert into control (S,N,B,Acheck,Adcheck,Blu,ADB)
values('Test','B','J','J','N','N', '');
Run Code Online (Sandbox Code Playgroud)
我的控制文件如下:
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;
/
Run Code Online (Sandbox Code Playgroud)
在我的uitvoer.sql中,我有一个这样的变量:
variable_s := '&&1';
variable_blu := '&&2';
Run Code Online (Sandbox Code Playgroud)
现在发生了以下情况.我启动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%';
Run Code Online (Sandbox Code Playgroud)
我期待以下内容:
old 89: s = '&&1';
new 89: s = 'Test';
old 128: b_lu := '&&2';
new 128: b_lu := 'J';
Run Code Online (Sandbox Code Playgroud)
为什么控制文件中的变量未正确解析为新的SQL文件?
我还发现了以下帖子: 如何将参数传递给在sqlplus中使用START调用的sql文件中的PL/SQL块?/ 从批处理文件启动PL/SQL脚本(带参数) 它看起来像我的挑战,但我不是从批处理文件调用,而是从sql文件调用.
我希望有一个人可以帮助我.如果有些事情不清楚,我可以尝试解释一下.
@是一个SQL*Plus命令,它在PL/SQL中没有任何意义.您的脚本在解析时被包含在PL/SQL块中,如果list缓冲区中的代码可以看到.控制块中声明的变量可直接用于"包含"代码,无需替换.
例如,如果uitvoer.sql只包含:
dbms_output.put_line(v_s);
Run Code Online (Sandbox Code Playgroud)
然后这个控制脚本:
set serveroutput on
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql
end;
/
list
Run Code Online (Sandbox Code Playgroud)
生产:
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;
Run Code Online (Sandbox Code Playgroud)
缓冲区中的PL/SQL块具有包含的代码,而不是对其的引用uitvoer.sql.但是包含的代码是有效的,因为它引用了控制脚本中的变量,该变量仍在范围内.
如果你想允许控制变量具有不同的名称,允许uitvoer.sql更灵活地调用,那么你仍然可以使用替换变量,但你仍然要替换变量名,而不是它的值.例如,有了这个uitvoer.sql(请注意,替换变量assginment 周围没有引号):
declare
variable_s varchar2(10);
begin
variable_s := &&1;
dbms_output.put_line(variable_s);
end;
Run Code Online (Sandbox Code Playgroud)
并且您的控制脚本传递变量名称:
declare
v_s varchar2(10) := 'Test';
begin
@uitvoer.sql v_s
end;
/
Run Code Online (Sandbox Code Playgroud)
你看:
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;
Run Code Online (Sandbox Code Playgroud)