在 SQL 开发人员和 SSIS ODBC 连接中定义、初始化和使用变量
Define, initialise and use variables in SQL developer and SSIS ODBC connection
我正在编写一个稍后在我的 SSIS ETL 中使用的脚本,源数据库是 oracle,我正在使用 SQL Developer 20.0.2.75。
我花了很多时间声明 100 个变量,但它在 SQL 开发人员中不起作用。
定义和初始化:
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
当使用“运行 语句”提示输入值时,“运行 脚本”不喜欢变量语句。
我什至试过了:
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 Dev)
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.
I spent so much time declaring 100 variables
对我来说,这似乎是一种错误的方法。好的,声明几个变量,但是有 100 个?!你为什么不切换到更容易维护的东西。什么?例如一个table.
create table params
(var varchar2(20),
value varchar2(20)
);
Pre-populate 它与您使用的所有变量(然后只更新它们的值),或者只插入行:
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')
如果很多用户使用它,考虑创建一个“master”params
table(包含所有变量)和一个全局临时table(每个用户都会填充和使用)。
我正在编写一个稍后在我的 SSIS ETL 中使用的脚本,源数据库是 oracle,我正在使用 SQL Developer 20.0.2.75。
我花了很多时间声明 100 个变量,但它在 SQL 开发人员中不起作用。
定义和初始化:
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
当使用“运行 语句”提示输入值时,“运行 脚本”不喜欢变量语句。
我什至试过了:
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 Dev)
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.
I spent so much time declaring 100 variables
对我来说,这似乎是一种错误的方法。好的,声明几个变量,但是有 100 个?!你为什么不切换到更容易维护的东西。什么?例如一个table.
create table params
(var varchar2(20),
value varchar2(20)
);
Pre-populate 它与您使用的所有变量(然后只更新它们的值),或者只插入行:
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')
如果很多用户使用它,考虑创建一个“master”params
table(包含所有变量)和一个全局临时table(每个用户都会填充和使用)。