2013-01-07 106 views
-1

我想提供產生動態查詢存儲過程的字符串參數:Oracle錯誤PLS-00103

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 

任何想法?

+0

編譯這個時候我不明白的語法錯誤。 – Chris

+0

@克里斯:你可以看到現在的錯誤... – hsuk

+0

看來你已經在字符串常量內換行(很難看到,如果你的編輯器會自動換行)。 – Chris

回答

1

更改:

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 '; 
1

如果FISCAL_YEAR是一個VARCHAR2如你所說,那麼它需要在引號puttng。更好的是,在這裏使用一個綁定變量。即

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是在沒有空格/或保留字的字符串行。

+0

我也試過這個,但是它的失敗,給出了同樣的錯誤... – hsuk

+0

輸出???如果你問生成的查詢,讓我知道如何做到這一點... – hsuk

+0

@hsuk忽視的是,我看到它的編譯。如果將它保存到.sql文件並使用SQL * PLus而不是GUI(是否是pl/sql開發者?)運行它,您是否也得到相同的錯誤?因爲它編譯好我在這裏 – DazzaL