我有一个使用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') || ''
中设置默认值。但我无法摆脱这种警告。
谢谢。
答案 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;