编译过程时出现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 程序时出现“无效字符错误”