-1

動的クエリを生成するストアド プロシージャに文字列パラメーターを指定しようとしています。

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

何か案が ?

4

2 に答える 2

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、行にスペースや予約語がない文字列であると想定しています。

于 2013-01-07T10:10:35.947 に答える
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 ';
于 2013-01-07T11:01:19.707 に答える