【问题标题】:Oracle using the like comparison taken from function in valueOracle 使用取自函数值的类似比较
【发布时间】:2015-08-03 10:19:54
【问题描述】:

我正在尝试创建一个简单的函数,它接受 3 个参数、2 个数字和一个字符串。我已经编写了函数,但是在对字符串使用 LIKE 比较时,没有从简单的 select 语句中得到预期的结果。

当字符串输入值设置为 ebts 时,下面函数中的选择不会返回任何行,但如果我将其作为独立选择状态运行,它会返回 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

如果我运行相同的选择替换,只传入上述值,则查询返回 2 行 - 我删除了函数的 like 子句,然后它返回 2 行,知道为什么子句的 like 部分无法匹配有行。

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    您正在尝试将字符串文字与以下内容匹配:

    AND AW_ACTIVE_ALARMS.module LIKE 'v_mod%';
    

    改成:

    AND AW_ACTIVE_ALARMS.module LIKE v_mod||'%';
    

    【讨论】:

      【解决方案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;
      /
      

      【讨论】:

      • MarioAna - 感谢您的及时回答,非常感谢 - 我第一次在这个网站上发帖,这很有效,让我节省了更多时间。 Boneist 感谢您的建议,非常有意义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-23
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多