Oracle使用类似于函数的比较值

时间:2015-08-03 10:19:54

标签: oracle plsql

我正在尝试创建一个简单的函数,它接受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行,任何想法为什么子句的相似部分无法匹配有行。

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