我可以在PL / SQL块中使用REGEXP_LIKE作为IF的条件

时间:2016-11-11 11:59:42

标签: regex oracle plsql

我试图创建一个旨在遍历组织单位树的功能,根据他们在树形结构中的级别以及它们出现在我们的Intranet页面上的天气来过滤掉一些。该函数的输入是起始单元的ORG_UNIT_ID,一个标志,用于显示我们是否应该关注Intranet标志和逗号分隔的级别列表。例如' 2,3'。我试图在循环中使用REGEXP_LIKE和ELSEIF来运行树,直到我点击第一个符合条件的父单元。

T_STOP是循环的控制变量。 R_ORG_UNIT_OVER用于查询上述单元的元数据。在循环第一次传递期间,这将是作为函数输入传递的单位之上的单位。

游标定义:

CURSOR C_ORG_UNIT_OVER(V_ORG_UNIT_ID ORG_UNIT.ORG_UNIT_ID%TYPE) IS
  SELECT  ORUI.ORG_UNIT_ID
  ,       ORUI.ORG_LEVEL
  ,       ORUI.SHOW_ON_INTRANET
FROM    ORG_UNIT ORUI
JOIN    ORG_UNIT_PARENT OUPA ON ORUI.ORG_UNIT_ID=OUPA.ORG_UNIT_ID_PARENT
WHERE   OUPA.ORG_UNIT_ID = V_ORG_UNIT_ID;

循环中失败的代码段:

IF R_ORG_UNIT_OVER.SHOW_ON_INTRANET = 'N' THEN
  T_ORG_UNIT_ID := R_ORG_UNIT_OVER.ORG_UNIT_ID;
ELSEIF REGEXP_LIKE (P_SKIP_LEVEL, '(^|,)' || R_ORG_UNIT_OVER.ORG_LEVEL || '($|,)') THEN
  T_ORG_UNIT_ID := R_ORG_UNIT_OVER.ORG_UNIT_ID;
ELSE
  T_STOP := 'Y';
END IF;

但是,此代码始终在REGEXP_LIKE符号上抛出PLS-00103错误。当用作PL / SQL IF / ELSEIF块中的条件而不是常规查询时,REGEXP_LIKE是否有某种限制或替代方式?

2 个答案:

答案 0 :(得分:3)

PL/SQL uses ELSIF, not ELSEIF。通过编辑,您的代码确实会出现您所描述的错误;这不是:

IF R_ORG_UNIT_OVER.SHOW_ON_INTRANET = 'N' THEN
  T_ORG_UNIT_ID := R_ORG_UNIT_OVER.ORG_UNIT_ID;
ELSIF REGEXP_LIKE (P_SKIP_LEVEL, '(^|,)' || R_ORG_UNIT_OVER.ORG_LEVEL || '($|,)') THEN
  T_ORG_UNIT_ID := R_ORG_UNIT_OVER.ORG_UNIT_ID;
ELSE
  T_STOP := 'Y';
END IF;

答案 1 :(得分:2)

是的,你可以。

declare 
    testvar varchar2(20) := 'Kittens';
begin
    if regexp_like(testvar, '^K') then
        dbms_output.put_line(testvar || ' matches ''^K''');
    end if;
end;

Kittens matches '^K'

PL/SQL procedure successfully completed.

包含一些测试数据,我会尝试查看哪些内容无效。例如,

declare 
    p_skip_level number := 2;
    org_level number := 3;
begin
    if regexp_like (p_skip_level, '(^|,)' || org_level || '($|,)')
    then
        dbms_output.put_line('Matched');
    else
        dbms_output.put_line('Not matched');
    end if;
end;