2016-10-10 5 views
0

Ich bekomme unten Fehler beim Erstellen unten Prozedur, ich habe auch den Großteil des Teils aus der Prozedur entfernt und enthalten nur Teil, die ich mit Problemen konfrontiert bin. Problem ist in der Entschlüsselungsklausel, bitte helfen !!!Orakel Fehler beim Kompilieren

[Warning] ORA-24344: Erfolg mit Kompilierungsfehler 84/41 PL/SQL: ORA-00907: fehlende rechte Klammer 33/4 PL/SQL: SQL-Anweisung ignoriert (2: 0): Warning : kompiliert aber mit Kompilierungsfehlern

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))))) 

Im Folgenden finden Sie die where-Klausel, wo ich Fragen stehe vor und gibt es kein Problem mit der Zählung der Klammer, dass ich beobachten kann, aber immer noch Orakel Fehler für diese wirft:

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

‚fehlende rechte Klammer‘ gibt Ihnen alle. Wenn Sie Notepad ++ oder etwas Hilfe mit der Klammer verwenden, werden Sie feststellen, dass Sie eine letzte Klammer auf verpassen ... "ODER srcsyscd IS NULL)))))" –

+1

Dies scheint keine Klammerprobleme zu sein. –

Antwort

0

Die komplexe Anweisung in Ihrer Dekodierung ist syntaktisch falsch. Sie können nicht schreiben:

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

Ich würde Sie die decode mit einer case-Anweisung vorschlagen ersetzen. Die Logik wird klarer zu lesen und zu pflegen sein.

Beispiel (nicht sicher, ob dies für Sie die richtige Logik ist)

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

können Sie bitte über Logik mit Groß-/Kleinschreibung schreiben –