2015-03-31 66 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注入了更多的保护。