Oracle - 与空警告的比较

时间:2017-02-09 10:28:49

标签: oracle

我有一个使用cursor的函数,此cursor由函数paramenters初始化:

FUNCTION get_keys(p_1    IN VARCHAR) 
                  RETURN VARCHAR AS
p_result    VARCHAR(5000);

CURSOR crs_keys IS
  SELECT     key_name
  FROM       table_keys
  WHERE      key = '' || p_1 || '';

BEGIN
 p_result := '1';
 return p_result;
END get_key_columns;

在编译时,我得到了警告:

comparison with null in get_keys
   WHERE      key = '' || p_1 || ''

我已经尝试在p_1'' || nvl(p_1, 'some test value') || ''中设置默认值。但我无法摆脱这种警告。

谢谢。

2 个答案:

答案 0 :(得分:2)

在你写的时候,

WHERE key = '' || p_1 || '';

两个单引号是一个空字符串,其值为NULL。并且NULL concat会产生NULL。

简单地写一下,

WHERE key=p_1;

如果打算将p_1的值括在文字引号中,请通过转义引号来执行此操作,或者要求传入的参数已在其值中包含此值。

答案 1 :(得分:1)

使用参数化光标它是更好更安全的方式。 实施例

declare
      cursor test_cur(l_name in varchar) is
        select l_name from dual;
    l_out varchar(1024);


   begin
     open test_cur('John');
     loop
       fetch test_cur into l_out;

       if test_cur%notfound then
         close test_cur;
        exit;
      end if;

       DBMS_OUTPUT.PUT_LINE(l_out);
     end loop;
   end;
   /

您修改后的代码

create or replace FUNCTION get_keys(p_1    IN VARCHAR) 
                  RETURN VARCHAR AS
p_result    VARCHAR(5000);

CURSOR crs_keys(p_cur in varchar) IS
  SELECT     key_name
  FROM       table_keys
  WHERE      key = p_cur 
or (p_cur is null and key is null); --comparing with null

BEGIN
open crs_keys(p_1);
     loop
       fetch crs_keys into p_result;

       if crs_keys%notfound then
         close crs_keys;
        exit;
      end if;

       DBMS_OUTPUT.PUT_LINE(p_result);
     end loop;
 p_result := '1';
 return p_result;
END get_keys;