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 存储过程中的动态变量的主要内容,如果未能解决你的问题,请参考以下文章

存储过程变量中存储SQL语句被截断的问题

PL_sql如何执行oracle存储过程

oracle的存储过程里怎样调用动态变量

如何在oracle存储过程中执行动态sql语句

oracle 存储过程 sql中in变量问题

oracle 中动态sql语句,表名为变量,怎么解