在SQL developer和SSIS ODBC连接中定义、初始化和使用变量
我正在编写一个脚本,稍后将在我的SSIS ETL中使用,源数据库是oracle,我使用的是SQL Developer 20.0.2.75 我花了太多时间声明了100个变量,但在SQLDeveloper中似乎不起作用 定义并初始化:在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
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运行时,我都想重新创建临时表。如果我创建一个私有临时表不是更好吗?