存储过程中的ORACLE sql动态变量

时间:2015-09-21 13:42:02

标签: oracle stored-procedures plsql

我想将一个变量添加到存储过程但我希望能够以两种不同的方式之一运行存储过程: - 如果它为null,则它运行所有内容,否则只匹配记录 - 如果为null,则将其设为默认值,否则只匹配记录

var countyvar varchar2(50);
begin
if countyvar is null then 'yyyy';
end if;
end;

OR

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;

2 个答案:

答案 0 :(得分:0)

我不知道这对你有帮助,但你可以使用" DEFAULT"过程参数声明中的关键字。例如:

PROCEDURE Get_emp_names (Dept_num IN NUMBER DEFAULT 20)
IS ...

然后您可以从内部控制手术流程。只需检查" countyvar"在程序中是否为空。

另请检查:Default Values to Stored Procedure in Oracle

答案 1 :(得分:0)

只需执行此操作...但请注意索引性能,根据您的数据大小,它可能会或可能不会比预期慢一点......测试它并根据需要稍微调整一下。

  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>>