組織単位のツリーをトラバースするように設計された関数を作成しようとしています。イントラネットページ。関数への入力は、開始ユニットの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を使用すると、通常のクエリではなく、何らかの制限や代替方法がありますか?
これは有効です。あなたが得る完全なエラースタックとは何ですか?また、あなたが示したものに関連する行番号はどのようにしていますか? 'R_ORG_UNIT_OVER.ORG_LEVEL'の実際の値がエラーのときにデバッグしましたか? Oracleのどのバージョンを使用していますか?実際の問題は以前の行にある可能性があります。 –
私はREGEXP_LIKEをより基本的な=カーソル変数と置き換えてみました。それは完璧に正常に動作しますが、私はREGEXP_LIKEを置き換えるたびにエラーを表示します。私は完全なエラーログを添付することができますが、これははるかに大きなユースケースの小さな例であるため、あまり意味をなさないかもしれません。 – Anders
OKですが、それは最近のバージョンで動作します。おそらく9iにはなかったのです(PL/SQLに追加されたときは手を覚えることができません)ので、古いバージョンを使用していますか? –