2016-11-11 5 views
1

組織単位のツリーをトラバースするように設計された関数を作成しようとしています。イントラネットページ。関数への入力は、開始ユニットのORG_UNIT_ID、イントラネットフラグとコンマ区切りのレベルリストを気にするべきかどうかを示すフラグです。たとえば '2,3'私は最初の適格な親ユニットをヒットするまで、ツリー内でELSEIFをループ内で使用するようにREGEXP_LIKEを使用しようとしています。PL/SQLブロックでIFを条件としてREGEXP_LIKEを使用できますか

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

これは有効です。あなたが得る完全なエラースタックとは何ですか?また、あなたが示したものに関連する行番号はどのようにしていますか? 'R_ORG_UNIT_OVER.ORG_LEVEL'の実際の値がエラーのときにデバッグしましたか? Oracleのどのバージョンを使用していますか?実際の問題は以前の行にある可能性があります。 –

+0

私はREGEXP_LIKEをより基本的な=カーソル変数と置き換えてみました。それは完璧に正常に動作しますが、私はREGEXP_LIKEを置き換えるたびにエラーを表示します。私は完全なエラーログを添付することができますが、これははるかに大きなユースケースの小さな例であるため、あまり意味をなさないかもしれません。 – Anders

+0

OKですが、それは最近のバージョンで動作します。おそらく9iにはなかったのです(PL/SQLに追加されたときは手を覚えることができません)ので、古いバージョンを使用していますか? –

答えて

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; 
+0

ありがとうございます。私はこの一日中、https://docs.oracle.com/cloud/latest/db112/LNPLS/controlstatements.htm#LNPLS394を見つめていましたが、まだ気づかなかった:( – Anders

1

はいできます。

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; 
関連する問題