2016-10-10 3 views
0

以下の手順を作成中にエラーが発生する場合があります。また、手順の一部を削除し、問題に直面している部分のみを含めました。問題は、decode節にありますので、助けてください!手順のコンパイル中にオラクルエラーが発生しました

[警告] ORA-24344:コンパイルエラー41分の84 PL/SQLでの成功: ORA-00907:欠落している右括弧33/4 PL/SQL:無視SQL文 (2:0):警告:コンパイルされたが、コンパイル・エラー以下

CREATE OR REPLACE PROCEDURE ERR_OUT (
    in_Srcsyscd     IN  VARCHAR2) 
IS 
    rcrdnums VARCHAR2 (32767); 
    rcrd_cnt INT; 
BEGIN 
    rcrd_cnt := 500; 

    SELECT RTRIM (
      XMLCAST (
       XMLAGG (XMLELEMENT (e, RCRDNUM) ORDER BY RCRDNUM) AS CLOB), 
      ',') 
    INTO rcrdnums 
    FROM (SELECT (ERR.RCRDNUM || ',') AS RCRDNUM 
      FROM tableName ERR 
        WHERE  ROWNUM <= rcrd_cnt 
        AND ( in_srcsyscd IS NULL 
         OR (decode (REGEXP_COUNT (in_srcsyscd, ','),0,(ERR.Srcsyscd = in_srcsyscd),        
           (ERR.Srcsyscd IN 
            (SELECT DISTINCT srcsyscd 
             FROM tableName 
             WHERE srcsyscd IN 
                (SELECT err.srcsyscd 
                FROM tableName ERR 
                  RIGHT OUTER JOIN 
                  ( SELECT UPPER (
                     REGEXP_SUBSTR (
                      in_Srcsyscd, 
                      '[^,]+', 
                      1, 
                      LEVEL)) 
                     CNTRY_CD 
                   FROM DUAL 
                  CONNECT BY REGEXP_SUBSTR (in_Srcsyscd, 
                     '[^,]+', 
                     1, 
                     LEVEL) 
                     IS NOT NULL) CNTRY_P 
                  ON (UPPER (
                    ERR.srcsyscd) != 
                    CNTRY_P.CNTRY_CD)) 
              OR srcsyscd IS NULL))))) 

私は問題に直面していると私が観察できるという括弧の数とは問題がないが、それでも、Oracleはこのためにエラーを投げているwhere句であると:

AND ( in_srcsyscd IS NULL 
         OR (decode (REGEXP_COUNT (in_srcsyscd, ','),0,(ERR.Srcsyscd = in_srcsyscd),        
           (ERR.Srcsyscd IN 
            (SELECT DISTINCT srcsyscd 
             FROM AMT_OWNER.AMT_EVNT_SPND_ERR_STG 
             WHERE srcsyscd IN 
                (SELECT err.srcsyscd 
                FROM TableName 
                  RIGHT OUTER JOIN 
                  ( SELECT UPPER (
                     REGEXP_SUBSTR (
                      'CONCUR', 
                      '[^,]+', 
                      1, 
                      LEVEL)) 
                     CNTRY_CD 
                   FROM DUAL 
                  CONNECT BY REGEXP_SUBSTR (
                     'CONCUR', 
                     '[^,]+', 
                     1, 
                     LEVEL) 
                     IS NOT NULL) CNTRY_P 
                  ON (UPPER (
                    ERR.srcsyscd) != 
                    CNTRY_P.CNTRY_CD)) 
              OR srcsyscd IS NULL))))) 
+0

「不足している右括弧」あなたのすべてを提供します。あなたがnotepad ++やかっこの助けを借りれば、 ...の最後の括弧が1つ見つからないことがわかります。 "OR srcsyscd IS NULL))))))" –

+1

これはかっこの問題ではないようです。 –

答えて

0

デコードの複雑な文が構文的に正しくありません。 あなたは書くことはできません。

decode(a,b,c,(err.srcsyscd in ...)) 

私はあなたがケース文でデコードを交換することをお勧め。ロジックは読みやすく、保守しやすくなります。

例(これはあなたのための正しいロジックであるかどうかわからない)

where rownum <= rcrd_cnt 
    and (case 
      when in_srcsyscd is null then 
      1 
      else 
      when regexp_count(in_srcsyscd, ',') = 0 then 
      case 
       when err.srcsyscd = in_srcsyscd then 
       1 
       else 
       0 
      end 
      else 
      when err.srcsyscd in 
       (select distinct srcsyscd 
        from tablename 
       where srcsyscd in 
         (select err.srcsyscd 
          from tablename err 
         right outer join (select upper(regexp_substr(in_srcsyscd, '[^,]+', 1, level)) cntry_cd 
              from dual 
              connect by regexp_substr(in_srcsyscd, '[^,]+', 1, level) is not null) cntry_p 
          on (upper(err.srcsyscd) != cntry_p.cntry_cd)) 
        or srcsyscd is null) then 
      1 
      else 
      0 
     end) = 1 
+0

ケースを使用して上記のロジックを書いてください –

関連する問題