2015-03-31 72 views
0

我在過程中使用動態SQL加載的遊標遇到問題。 我的查詢包含日期和我有這個錯誤:使用動態SQL加載光標

ORA-00932:不一致的數據類型;預產期 ;得到:NUMBER

這裏是我的方法:

create or replace procedure EMP_CURSOR (
    p_date in date, 
    p_schema in varchar2 
) is 

    c_emp sys_refcursor; 

begin 

    open c_emp for 
     'select ID, NAME 
     from ' || DBMS_ASSERT.schema_name(p_schema) || '.EMP 
     where DATE_MAJ >= ' || p_date; 

    EMP (c_emp); 

    exception 
     when others then 
      DBMS_OUTPUT.put_line(SQLERRM); 

end; 

這是我怎麼稱呼它:

exec EMP_CURSOR(to_date('01/01/2015','dd/MM/yyyy'),'TEST'); 

我不知道如何通過日期的動態查詢。 當我刪除動態部分,我把模式名稱在查詢中,它工作正常。

+0

什麼是p_dateRefresh? – jarlh 2015-03-31 07:59:16

+0

@jarlh哎呀抱歉,這是我的例子中的一個錯誤,我修正了它;) – BnJ 2015-03-31 08:01:26

回答

2

根據您的NLS_DATE_FORMAT,Oracle隱式地將p_date轉換爲字符串,因爲您將它連接到字符串;你需要使用bind variables,每the documentation

open c_emp for 
'select ID, NAME 
    from ' || DBMS_ASSERT.schema_name(p_schema) || '.EMP 
    where DATE_MAJ >= :1' using p_date; 

這也爲您提供了從SQL注入了更多的保護。