用动态SQL加载的游标

时间:2015-03-31 07:51:09

标签: sql oracle

我遇到了一个游标问题,我在程序中加载了动态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');

我不知道如何传递动态查询的日期。 当我删除动态部分并将模式名称放在查询中时,它可以正常工作。

1 个答案:

答案 0 :(得分:2)

Oracle根据您的NLS_DATE_FORMAT隐式将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注入提供了更多保护。