我想将变量参数传递给外部SQL文件(带有SQL * Plus的PL / SQL)

耶伦·穆德(Jeroen Mulder)

我已经在这个论坛上搜索并通过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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

我想将变量参数传递给外部SQL文件(带有SQL * Plus的PL / SQL)

来自分类Dev

PL / SQL编译失败时如何使SQL * Plus退出

来自分类Dev

将文件内容作为参数传递给Sql * Plus命令

来自分类Dev

将存储在PL / SQL变量中的值传递给IN子句

来自分类Dev

如何在SQL Plus / SQL-PL中使用迭代或作为函数运行查询?

来自分类Dev

存储变量 [PL/SQL]

来自分类Dev

PL SQL动态SQL

来自分类Dev

PL / SQL:将字符串的“数组”作为参数传递给sql

来自分类Dev

在 SQL developer 中从外部文件编译 PL/SQL 存储过程

来自分类Dev

PL/SQL 创建带有索引的表

来自分类Dev

如何将PL / SQL .sql文件转换为SQL * PLUS,以便可以与Windows Task Scheduler一起运行

来自分类Dev

使用外部联接的PL / SQL

来自分类Dev

SQL PL/SQL 动态变量绑定

来自分类Dev

PL / SQL,无法打印变量

来自分类Dev

将值列表作为输入参数传递给PL / SQL过程

来自分类Dev

将子查询的结果作为参数传递给PL / SQL包

来自分类Dev

PL/SQL 别名/变量到现有 SQL 查询

来自分类Dev

如何将键值传递给PL / SQL过程?

来自分类Dev

将复杂的Java类传递给pl / sql函数

来自分类Dev

每个将表名传递给过程的ORACLE PL / SQL

来自分类Dev

PL / SQL层次排序

来自分类Dev

PL / SQL Oracle交互

来自分类Dev

从PL / SQL调用Java

来自分类Dev

PL / SQL提交问题

来自分类Dev

增量聚合:PL / SQL

来自分类Dev

最高/最低pl / sql

来自分类Dev

PL / SQL语法问题

来自分类Dev

PL / SQL While / For循环

来自分类Dev

PL / SQL比较XMLTypes