编译过程时出现oracle错误

Posted

技术标签:

【中文标题】编译过程时出现oracle错误【英文标题】:oracle error while compiling procedure 【发布时间】:2016-10-10 10:54:21 【问题描述】:

我在创建以下程序时遇到错误,我还从程序中删除了大部分部分,并且只包含了我遇到问题的部分。问题出在解码子句中,请帮忙!!!

[警告] ORA-24344:编译错误 84/41 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)))))

下面是我遇到问题的 where 子句,我可以观察到的括号计数没有问题,但 oracle 仍然为此抛出错误:

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

【问题讨论】:

'缺少右括号'给你所有。如果您使用 notepad++ 或一些括号帮助,您会发现您错过了最后一个括号 ..."OR srcsyscd IS NULL))))))" 这似乎不是括号问题。 【参考方案1】:

您的解码中的复杂语句在语法上不正确。 你不能写:

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

我建议你用 case 语句替换 decode。逻辑将更清晰易读和维护。

示例(不确定这是否适合您)

 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

【讨论】:

你能用case写出上面的逻辑吗

以上是关于编译过程时出现oracle错误的主要内容,如果未能解决你的问题,请参考以下文章

ORA -00909 //sql 语句被忽略 ...过程创建时出现编译错误

过程创建时出现编译错误 PL/SQL: ORA-00947: not enough values

使用 `getclobval()` 执行 oracle 程序时出现“无效字符错误”

让 oracle 函数知道数据是不是为素数。收到警告:创建时出现编译错误的函数

编译触发器时出现 Oracle 错误 ORA-00922

编译 mex 文件时出现链接错误