Oracle 错误 PLS-00103
Posted
技术标签:
【中文标题】Oracle 错误 PLS-00103【英文标题】:Oracle error PLS-00103 【发布时间】:2013-01-07 09:33:09 【问题描述】:我正在尝试在生成动态查询的存储过程上提供一个字符串参数:
CREATE OR REPLACE procedure FMIS3.dynamic_pivot(p_cursor in out sys_refcursor, FISCAL_YEAR in FMS_K_BUDGET_ALLOCATION_MST.FKBAM_FISCAL_YEAR%type)
as
sql_query varchar2(5000) := 'select FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
begin
for x in (select distinct PFS_SOURCE_ID,PFS_SOURCE_ENG from PBS_FC_SOURCE WHERE PFS_UPPER_SOURCE_ID!=0 )
loop
sql_query := sql_query ||
' , sum(case when FKBAB_SOURCE_ID = '||x.PFS_SOURCE_ID||' then FKOD_AMOUNT ELSE 0 end) as '||x.PFS_SOURCE_ENG;
dbms_output.put_line(sql_query);
end loop;
sql_query := sql_query || ' FROM FMS_K_OFFICEWISE_DTL
JOIN FMS_K_OFFICEWISE_MST ON FMS_K_OFFICEWISE_MST.FKOM_OFFICE_MST_ID=FMS_K_OFFICEWISE_DTL.FKOD_OFFICE_MST_ID
JOIN FMS_K_BUDGET_ALLOCATION_DTL ON FMS_K_BUDGET_ALLOCATION_DTL.FKBAD_BUDGET_ALLOC_DTL_ID=FMS_K_OFFICEWISE_DTL.FKOD_BUDGET_ALLOC_AD_ID
JOIN FMS_K_BUDGET_ALLOCATION_MST ON FMS_K_BUDGET_ALLOCATION_MST.FKBAM_BUDGET_ALLOC_ID=FMS_K_BUDGET_ALLOCATION_DTL.FKBAB_BUDGET_ALLOC_ID
JOIN PBS_FC_BUDGET ON PBS_FC_BUDGET.PFB_BUDGET_ID=FMS_K_BUDGET_ALLOCATION_MST.FKBAM_BUDGET_ID
WHERE FKBAM_FISCAL_YEAR='||FISCAL_YEAR||'
GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
dbms_output.put_line(sql_query);
open p_cursor for sql_query;
end;
你可以看到我使用参数中的值作为条件
WHERE FKBAM_FISCAL_YEAR='||FISCAL_YEAR||'
但这给了我错误:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:
begin case declare end exception exit for goto if loop mod
null pragma raise return select update while with
<an identifier> <a double-quoted delimited-identifier>
<a bind variable> << close current delete fetch lock insert
open rollback savepoint set sql execute commit forall merge
pipe
有什么想法吗?
【问题讨论】:
编译时没有出现语法错误。 @Chris:您现在可以看到错误... 似乎你在字符串常量中有一个换行符(很难看出你的编辑器是否换行)。 我删除了那个中断,错误似乎消失了,但它没有返回真实条件的结果 “它没有返回真实条件的结果”——您希望我们对此做些什么呢?你有数据,你有结果,你了解业务规则。我们不是心灵感应器,我们无法远程调试您的实现。 【参考方案1】:如果FISCAL_YEAR
是你所说的 varchar2,那么它需要在引号中加上。更好的是,在这里使用绑定变量。即
WHERE FKBAM_FISCAL_YEAR=:year
GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
open p_cursor for sql_query using fiscal_year;
如果仍然失败,请向我们展示该行的输出
dbms_output.put_line(sql_query);
我还假设PFS_SOURCE_ID
是一个数字,PFS_SOURCE_ENG
是一个字符串,行中没有空格/或保留字。
【讨论】:
输出???如果您正在询问生成的查询,请告诉我如何做到这一点... @hsuk 忽略这一点,我在编译时看到了它。如果您将其保存到 .sql 文件并使用 SQL*PLus 而不是 GUI 运行它(是 pl/sql 开发人员吗?)您会得到相同的错误吗?因为它在这里编译对我来说没问题 不是 SQL*Plus,是 Toad【参考方案2】:改变:
WHERE FKBAM_FISCAL_YEAR='||FISCAL_YEAR||'
GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
到
WHERE FKBAM_FISCAL_YEAR='''||FISCAL_YEAR||''' GROUP BY FKOM_OFFICE_ID,FKBAM_BUDGET_ID ';
【讨论】:
以上是关于Oracle 错误 PLS-00103的主要内容,如果未能解决你的问题,请参考以下文章
oracle程序错误PLS-00103遇到符号“END”[关闭]