我正在尝试创建一个简单的函数,它接受3个参数,2个数字和一个字符串。我已经编写了函数,但是在使用字符串的LIKE比较时,我没有从简单的select语句中获得预期的结果。
从下面的函数中选择在字符串输入值设置为ebts时执行时不返回任何行,但如果我将其作为独立的select状态运行,则返回2行,这是我所期望的。已使用dbms输出来确定是否正在传递空白但所有看起来都没问题。
CREATE OR REPLACE FUNCTION OPC_OP.sitezone_exists
(in_site_id IN NUMBER, in_zone_id IN NUMBER, in_mod VARCHAR2)
RETURN NUMBER
IS
v_count_rec NUMBER;
v_return NUMBER;
v_mod VARCHAR2(4) := in_mod;
BEGIN
SELECT COUNT(*)
INTO v_count_rec
FROM AW_ACTIVE_ALARMS
WHERE AW_ACTIVE_ALARMS.site_id = in_site_id
AND AW_ACTIVE_ALARMS.zone_id = in_zone_id
AND AW_ACTIVE_ALARMS.module LIKE 'v_mod%';
IF v_count_rec > 0
THEN
DBMS_OUTPUT.PUT_LINE('count'||v_count_rec||'=========='||v_mod||'=============');
v_return:= 1;
RETURN (v_return);
ELSE
DBMS_OUTPUT.PUT_LINE('count'||v_count_rec||'=========='||v_mod||'=============');
v_return:= 0;
RETURN (v_return);
END IF;
END sitezone_exists;
当传入值12,12时,ebts显示的输出为:
数0 ========== ebts ============= RetVal = 0
如果我运行相同的select只是传递上面的值,则查询返回2行 - 我已经删除了函数的like子句,然后返回2行,任何想法为什么子句的相似部分无法匹配有行。
答案 0 :(得分:4)
您正在尝试将字符串文字与此匹配:
AND AW_ACTIVE_ALARMS.module LIKE 'v_mod%';
将其更改为:
AND AW_ACTIVE_ALARMS.module LIKE v_mod||'%';
答案 1 :(得分:2)
MarioAna有正确的答案,IMO,但作为一个旁边(评论太长),你的功能可以更好地写。
你正在复制dbms_output代码,而且在一个函数中有一个RETURN
被认为是最好的做法(尽管我认为更多可能没问题 - 一个在正文中,一个异常在异常中阻止...),所以你可以把它重写为:
CREATE OR REPLACE FUNCTION OPC_OP.sitezone_exists
(in_site_id IN NUMBER, in_zone_id IN NUMBER, in_mod VARCHAR2)
RETURN NUMBER
IS
v_count_rec NUMBER;
v_return NUMBER;
v_mod VARCHAR2(4) := in_mod;
BEGIN
SELECT COUNT(*)
INTO v_count_rec
FROM AW_ACTIVE_ALARMS aaa
WHERE aaa.site_id = in_site_id
AND aaa.zone_id = in_zone_id
AND aaa.module LIKE v_mod||'%';
DBMS_OUTPUT.PUT_LINE('count '||v_count_rec||'=========='||v_mod||'=============');
IF v_count_rec > 0 THEN
v_return := 1;
ELSE
v_return:= 0;
END IF;
RETURN (v_return);
END sitezone_exists;
/