2016-10-10 2 views
0

Я получаю ниже ошибки при создании ниже процедуры, я также удалил большую часть части из процедуры и включил только часть, с которой сталкиваются проблемы. Проблема заключается в расшифровке, пожалуйста, помогите !!!ошибка oracle во время процедуры компиляции

[Предупреждение] ORA-24344: успех ошибки компиляции 84/41 PL/SQL: ORA-00907: отсутствует правая скобка 33/4 PL/SQL: SQL Statement игнорируется (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))))) 

Ниже где положением, где я сталкиваюсь с проблемами, и нет никакой проблемы с кол-скобки, что я могу наблюдать, но все же оракул бросает ошибку для этого:

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

«отсутствует правая скобка» дает вам все. Если вы используете блокнот ++ или какую-то помощь в скобках, вы обнаружите, что пропустите одну последнюю скобку на ... «ИЛИ 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

вы можете написать выше логику с использованием случая –

Смежные вопросы