我试图创建一个旨在遍历组织单位树的功能,根据他们在树形结构中的级别以及它们出现在我们的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是否有某种限制或替代方式?
答案 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;