在SQL developer和SSIS ODBC连接中定义、初始化和使用变量

在SQL developer和SSIS ODBC连接中定义、初始化和使用变量,sql,oracle,parameters,oracle-sqldeveloper,Sql,Oracle,Parameters,Oracle Sqldeveloper,我正在编写一个脚本,稍后将在我的SSIS ETL中使用,源数据库是oracle,我使用的是SQL Developer 20.0.2.75 我花了太多时间声明了100个变量,但在SQLDeveloper中似乎不起作用 定义并初始化: Declare V1 number; V2 number; . . . V100

我正在编写一个脚本,稍后将在我的SSIS ETL中使用,源数据库是oracle,我使用的是SQL Developer 20.0.2.75

我花了太多时间声明了100个变量,但在SQLDeveloper中似乎不起作用

定义并初始化:

      Declare 
              V1 number;
              V2 number;
               .
               .
               .
              V100 number;

     Begin 

       Select UDF(params1,param2) into V1 from dual; 
       Select UDF(params3,param4) into V2 from dual; 
      ...
       End;
我希望我能在脚本中使用这些变量,比如:

     select columns from table where Col1=:V1 and Col2=:V2  
当使用Run语句提示输入值时,Run脚本看不到类似于变量语句

我甚至试过:

      select columns from table where Col1=&&V1 and Col2=&&V2  
现在我的查询不起作用了

在以下回复之后,我将脚本更改为:

        Variable  V1 Number;
        Variable  V2 Number;

      exec select MyFunction(p1,p2) into :V1 from Dual; 
       /
      Select columns from table where col1=:V1 and col2=:V2 
它仍然提示输入值

这就是我定义函数的方式

       Create Function MyFunction(m IN Varchar, s IN Number) 
       Return Number
       IS c Number;

       select code into c  from table where col1=m and col2=s;
       Return(c);
       End;

函数有什么问题吗?

您可以按照在SQL Plus或SQLcl中的方式定义变量,然后将其作为脚本运行

下文

variable x1 number
begin
  select 123 into :x1 from dual;
end;
/
print x1
SQL Plus中的类似示例也适用于SQL开发

SQL> set serverout on
SQL> variable x1 number
SQL> begin
  2    select 5 into :x1 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print x1

        X1
----------
         5

SQL>
SQL> select rownum from dual
  2  connect by level <= :x1;

    ROWNUM
----------
         1
         2
         3
         4
         5

SQL>
SQL> begin
  2    dbms_output.put_line('X1 is '||:x1);
  3  end;
  4  /
X1 is 5

PL/SQL procedure successfully completed.

您可以按照在SQL Plus或SQLcl中使用的方式定义变量,然后将其作为脚本运行

下文

variable x1 number
begin
  select 123 into :x1 from dual;
end;
/
print x1
SQL Plus中的类似示例也适用于SQL开发

SQL> set serverout on
SQL> variable x1 number
SQL> begin
  2    select 5 into :x1 from dual;
  3  end;
  4  /

PL/SQL procedure successfully completed.

SQL> print x1

        X1
----------
         5

SQL>
SQL> select rownum from dual
  2  connect by level <= :x1;

    ROWNUM
----------
         1
         2
         3
         4
         5

SQL>
SQL> begin
  2    dbms_output.put_line('X1 is '||:x1);
  3  end;
  4  /
X1 is 5

PL/SQL procedure successfully completed.
我花了很多时间声明100个变量

在我看来,这似乎是一个错误的方法。好吧,声明几个变量,但100个?!你为什么不换个更容易维护的呢。什么例如,一张桌子

create table params
  (var          varchar2(20),
   value        varchar2(20)
  );
使用您使用的所有变量预先填充它,然后只更新它们的值,或者只插入行:

insert into params (var, value) values ('v1', UDF(params1, param2));
insert into params (var, value) values ('v2', UDF(params3, param4));
...
通过函数获取值:

create or replace function f_params (par_var in varchar2)
  return varchar2
is
  retval varchar2(20);
begin
  select value
    into retval
    from params
    where var = par_var;
  return retval;
end;
在查询中使用它作为:

select columns 
from table 
where Col1 = f_params('v1')
  and Col2 = f_params('v2')

如果有许多用户使用它,请考虑创建一个包含所有变量的主PARAMS表和一个全局临时表,这些表将由这些用户中的每个用户填充和使用。 我花了很多时间声明100个变量

在我看来,这似乎是一个错误的方法。好吧,声明几个变量,但100个?!你为什么不换个更容易维护的呢。什么例如,一张桌子

create table params
  (var          varchar2(20),
   value        varchar2(20)
  );
使用您使用的所有变量预先填充它,然后只更新它们的值,或者只插入行:

insert into params (var, value) values ('v1', UDF(params1, param2));
insert into params (var, value) values ('v2', UDF(params3, param4));
...
通过函数获取值:

create or replace function f_params (par_var in varchar2)
  return varchar2
is
  retval varchar2(20);
begin
  select value
    into retval
    from params
    where var = par_var;
  return retval;
end;
在查询中使用它作为:

select columns 
from table 
where Col1 = f_params('v1')
  and Col2 = f_params('v2')


如果许多用户使用它,请考虑创建一个包含所有变量的主PARAMS表和一个全局临时表,这些表将被这些用户中的每个用户填充和使用。谢谢,我已经看过了。Justin Cave的答案与我的情况非常接近,问题是他只是简单地打印参数,而不在查询中使用它。当我这样做时,它仍然提示输入值这是否回答了您的问题@谢谢,我已经看过了。Justin Cave的答案与我的情况非常接近,问题是他只是简单地打印参数,而不在查询中使用它。当我这样做时,它仍然提示输入值。我不是在打印变量的值,而是在另一个脚本中使用该变量。当您使用该变量时,它会提示您输入值:在您的查询中,您可以在任何地方使用该变量……我在原始回答中添加了一个示例。我没有试图打印该变量的值,我正在另一个脚本中使用该变量。当您将该变量与一起使用时,它会提示输入值:在查询中,您可以在任何地方使用该变量…我在原始回答中添加了一个示例谢谢,这都将进入ETL并将每天自动运行。我没有创建表的权限。你认为我可以用临时表做同样的事情吗?我不知道你叫临时表什么,但是-如果你选择使用我建议的,请DBA为你创建一个表。因为我们不提交这个查询,params表在这里扮演临时表的角色。对吧?不,这不是我的本意。如果希望将这些行永久存储在数据库中,则需要提交。这很明显;除非启用“自动提交”,否则一旦终止会话,未提交的内容将丢失。所以-是的,您必须在INSERT之后提交。但我不想永久存储这些值,每次ETL运行时,我都想重新创建临时表。如果我创建一个私有临时表不是更好吗?谢谢,这都会进入ETL,并且每天都会自动运行。我没有创建表的权限。你认为我可以用临时表做同样的事情吗?我不知道你叫临时表什么,但是-如果你选择使用我建议的,请DBA为你创建一个表。因为我们不提交这个查询,params表在这里扮演临时表的角色。对吧?不,这不是我的本意。如果希望将这些行永久存储在数据库中,则需要提交。这很明显;除非启用“自动提交”,否则一旦终止会话,未提交的内容将丢失。所以-是的,您必须在INSERT之后提交。但我不想永久存储这些值,每次ETL运行时,我都想重新创建临时表。如果我创建一个私有临时表不是更好吗?