ORACLE sql 存储过程中的动态变量
Posted
技术标签:
【中文标题】ORACLE sql 存储过程中的动态变量【英文标题】:ORACLE sql dynamic variables in stored procedure 【发布时间】:2015-09-21 13:42:02 【问题描述】:我想将变量添加到存储过程,但我希望能够以两种不同方式之一运行存储过程: - 如果为空,则运行所有内容,否则仅匹配记录 - 如果为空,则将其设为默认值,否则仅匹配记录
var countyvar varchar2(50);
begin
if countyvar is null then 'yyyy';
end if;
end;
或
var countyvar varchar2(50);
begin
if countyvar is null then run script for all locations;
if countyvar is 'yyyy' then run script for only that location;
end if;
end;
在这里使用:
select locations, count(accountID) from dim_locations where location_name = :COUNTYVAR group by locations;
【问题讨论】:
【参考方案1】:我不知道这是否对您有帮助,但您可以在过程参数声明中使用“DEFAULT”关键字。例如:
PROCEDURE Get_emp_names (Dept_num IN NUMBER DEFAULT 20)
IS ...
然后您可以从内部控制程序的流程。只需检查“countyvar”是否在过程中为空。
也检查一下:Default Values to Stored Procedure in Oracle
【讨论】:
唯一的问题是 DEFAULT 仅在您不提供参数时才有效...如果您调用:get_emp_names ( NULL )
...它不会使用 20 .. 它会使用"NULL" ;) (如果你传递一个变量就是这种情况......即get_emp_names ( l_some_var )
......而l_some_var恰好是NULL......
我在答案的底部添加了一个更详细的示例来展示这种行为;)【参考方案2】:
只需这样做...注意索引性能,但是,它的执行速度可能会或可能不会比预期慢一点,具体取决于您的数据大小等等...测试一下并根据需要进行一些调整。
select locations, count(accountID)
from dim_locations
where ( :COUNTYVAR IS NULL
OR location_name = :COUNTYVAR )
group by locations;
[[其他答案中提到的DEFAULT选项的解释]]
DEFAULT 选项仅在未提供参数时才启动,而不是在它为 NULL 时...这里是显示行为的测试示例 - 试试看 ;)
set serverout on
declare
lv_var varchar2(10);
procedure p_test ( in_parm IN varchar2 default 10 )
is
begin
dbms_output.put_line ( 'in_parm is: ' || nvl(in_parm,'<<NULL>>') );
end;
begin
p_test ( 123 );
p_test ();
p_test ( NULL );
lv_var := 234;
p_test ( lv_var );
lv_var := NULL;
p_test ( lv_var );
end;
/
in_parm is: 123
in_parm is: 10
in_parm is: <<NULL>>
in_parm is: 234
in_parm is: <<NULL>>
【讨论】:
是的,第一部分效果很好。系统提示我输入一个值或将其保留为 NULL。 是的,第一部分效果很好;提示 Ii 输入一个值或将其保留为 NULL。我对其进行了如下调整,它编译成功 create or replace PROCEDURE PENETRATION_REPORT AS COUNTYVAR VARCHAR2(25 CHAR);文本 VARCHAR2(40 字符); IF (COUNTYVAR IS NULL) THEN TEXT := 'B.COUNTY IS NULL'; ELSE TEXT := ' B.COUNTY :=' ||县;万一;但由于我需要以表格格式工作,这就是它崩溃的地方: 对编辑问题表示歉意,因为我没有意识到编辑 cmets 有时间限制以上是关于ORACLE sql 存储过程中的动态变量的主要内容,如果未能解决你的问题,请参考以下文章