我遇到了一个游标问题,我在程序中加载了动态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 :(得分: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注入提供了更多保护。