功能中缺少右括号

时间:2013-06-17 06:03:30

标签: oracle oracle10g

我是这个论坛的新手。我收到了一个错误

  

错误 - ORA-00907:缺少右括号

当我尝试运行我的查询时,请帮我解决这个问题,请在下面找到查询提前谢谢!

我正在编写如下函数 -

create or replace
function ATOS_GET_GDC_ROLLUP (p_gdc in varchar, p_year in number, p_userid in number, p_gdcpara in varchar) return ATOS_CAPACITY_ROLLUP_TYPE_SI
as

v_capacity_rollup_si ATOS_CAPACITY_ROLLUP_TYPE_SI;
v_name varchar2(255);
v_month varchar2(20);
v_budget number;
v_supply number;
v_pipeline number;
v_demand number;
v_monthtext varchar2(3);
v_monthvalue number;

i number;

code number;

CURSOR c_get_capacity_rollup IS select par.INVESTMENT,
decode(par.partime,null,children.childtime,par.par time),
decode(par.BUDGET,null,children.BUDGET,0,children. BUDGET,par.BUDGET),
decode(par.SUPPLYSIDE,null,children.SUPPLYSIDE,0,c hildren.SUPPLYSIDE,par.SUPPLYSIDE),
decode(par.PIPELINE,null,children.PIPELINE,0,child ren.PIPELINE,par.PIPELINE),
decode(par.DEMANDSIDE,null,children.DEMANDSIDE,0,c hildren.DEMANDSIDE,par.DEMANDSIDE),
case (decode(par.monthvalue,null,children.monthvalue,pa r.monthvalue))
when 1 then 'Jan'
when 2 then 'Feb'
when 3 then 'Mar'
when 4 then 'Apr'
when 5 then 'May'
when 6 then 'Jun'
when 7 then 'Jul'
when 8 then 'Aug'
when 9 then 'Sep'
when 10 then 'Oct'
when 11 then 'Nov'
when 12 then 'Dec'
else ''
end as monthtext,
(decode(par.monthvalue,null,children.monthvalue,pa r.monthvalue)) monthvalue
from 
(select
(budp.periodyear || '-' || lpad(budp.periodnumber, 2, '0')) partime,
reqp.name INVESTMENT,
budp.budget BUDGET,
budp.actual SUPPLYSIDE,
budp.user1 PIPELINE,
budp.user4 DEMANDSIDE,
budp.periodnumber monthvalue
from tr_request reqp
inner join tr_resourcebudget budp on reqp.requestid = budp.requestid
where budp.periodyear= p_year 
and reqp.requestid = (select I_GDC.REQUESTID
from TR_REQUEST I_GDC
where I_GDC.NAME = p_gdcpara
and A7_GET_RQV (I_GDC.REQUESTID, 'Investment Category', 'C') = 'Global Delivery Centre (GDC)'
and (p_gdc = 'ALL' or p_gdc = I_GDC.NAME)
and exists (select null
from TR_REQUESTACCESS RA
where RA.REQUESTID = I_GDC.REQUESTID
and RA.RESOURCEID = p_userid)))par
FULL OUTER JOIN
(select 
(budc.periodyear || '-' || lpad(budc.periodnumber, 2, '0')) childtime,
SUM(budc.budget) BUDGET,
SUM(budc.actual) SUPPLYSIDE,
SUM(budc.user1) PIPELINE,
SUM(budc.user4) DEMANDSIDE,
budc.periodnumber monthvalue
from tr_request reqc
inner join tr_resourcebudget budc on reqc.requestid = budc.requestid
where budc.periodyear= p_year 
and reqc.requestid IN (SELECT requestid FROM TR_REQUEST
WHERE CONNECT_BY_ISLEAF=1
CONNECT BY PRIOR requestid = parentid
START WITH requestid = (select I_GDC.REQUESTID
from TR_REQUEST I_GDC
where I_GDC.NAME = p_gdcpara
and A7_GET_RQV (I_GDC.REQUESTID, 'Investment Category', 'C') = 'Global Delivery Centre (GDC)'
and (p_gdc = 'ALL' or p_gdc = I_GDC.NAME)
and exists ( select null
from TR_REQUESTACCESS RA
where RA.REQUESTID = I_GDC.REQUESTID
and RA.RESOURCEID = p_userid)))
group by budc.periodnumber, (budc.periodyear || '-' || lpad(budc.periodnumber, 2, '0')))children
ON par.partime = children.childtime;


begin

if not c_get_capacity_rollup%ISOPEN then
open c_get_capacity_rollup;
end if;

i := 0;
v_capacity_rollup_si := ATOS_CAPACITY_ROLLUP_TYPE_SI();

loop
fetch c_get_capacity_rollup into v_name, v_month, v_budget, v_supply, v_pipeline, v_demand, v_monthtext,v_monthvalue;

exit when c_get_capacity_rollup%NOTFOUND;

i := i + 1;
v_capacity_rollup_si.extend(1);
v_capacity_rollup_si(i) := ATOS_CAPACITY_ROLLUP_RECORD_SI(v_name, v_month, v_budget, v_supply, v_pipeline, v_demand, v_monthtext, v_monthvalue);

end loop;
close c_get_capacity_rollup;

return v_capacity_rollup_si;

end ATOS_GET_GDC_ROLLUP;
/

当我在查询下面运行时: -

select * from table(ATOS_GET_GDC_ROLLUP('India',2013,400,'India' ))

我在第18行和第91行错过了paranthisis错误。但是当我运行游标查询时,我得到了正确的输出。我确认括号是平衡的。请告诉我上面的查询有什么问题。如果您需要更多详细信息,请与我们联系。

我正在使用以下版本 -

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod
PL/SQL Release 10.2.0.1.0 - Production
"CORE   10.2.0.1.0  Production"
TNS for 32-bit Windows: Version 10.2.0.1.0 - Production
NLSRTL Version 10.2.0.1.0 - Production

1 个答案:

答案 0 :(得分:1)

你得到的错误并不总是意味着有一个无与伦比的支架。有时,当我们发生语法错误时,编译器会抛出该错误,并且当它具有未配对的左括号时,它会找到一个不期望的关键字。

然后你说:

  

“当我运行游标查询然后我得到正确的输出。我   确认括号是平衡的。“

嗯,好吧那么问题可能是这个:

  

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod

这是10gR2的未修补的第一个版本。通常我们希望能够在PL / SQL中运行任何可以在SQL中运行的查询。但是,有时会出现错误,特别是在主要版本的初始版本中,这违反了合同。

多年来,已有三到四个主要补丁集(取决于您的操作系统)。任何仍在原始版本上运行的人大概是这样做的,因为他们没有支持合同,因此无法修补他们的数据库。如果是这样,那就排除了将数据库升级为可能的解决方案。

您可以做的唯一其他事情是调试您的查询。很多嵌套的子查询(以及许多括号)都非常复杂。很可能是导致问题的那些子查询的深度。因此,开始从查询中删除一些复杂性,并查看查询何时开始工作。然后你知道需要重写哪一个逻辑。

要尝试的另一件事是简化程序。您不需要所有CURSOR和LOOP基础结构。您可以使用带有BULK COLLECT的Plain Old SQL Query来填充v_capacity_rollup_si。或者从过程中提取查询并将其隐藏在视图后面。这些事情中的任何一个都可能解决问题,因为问题是SQL和PL / SQL之间的交互,而不是实际的查询。