我想能够像这样执行我的下面的过程:
exec procname('29-JAN-2011');
proc代码是:
PROCEDURE procname(pardate VARCHAR2) IS
vardate DATE := to_date(pardate, 'DD-MON-YYYY');
SQLS VARCHAR2(4000);
BEGIN
SQLS := 'SELECT cola, colb
FROM tablea
WHERE TRUNC(coldate) = TRUNC(TO_DATE('''||pardate||''',''DD/MON/YYYY''))';
EXECUTE IMMEDIATE SQLS;
END;
它不断抛出错误:
ORA-00904:“JAN”:标识符无效。
它编译,但是当我运行此命令时它会抛出错误:
EXEC procname('29-JAN-2011');
答案 0 :(得分:6)
您声明一个将输入参数强制转换为日期的变量:为什么不使用它?
此外,应用于日期的TRUNC()将删除时间元素。你在这里不需要它,因为你传递的价值没有时间。
所以,你的代码应该是:
PROCEDURE procname(pardate VARCHAR2) IS
vardate DATE := to_date(pardate, 'DD-MON-YYYY');
SQLS VARCHAR2(4000) := 'select cola, colb FROM tablea
WHERE TRUNC(coldate) = :1';
l_a tablea.cola%type;
l_b tablea.colb%type;
BEGIN
EXECUTE IMMEDIATE SQLS
into l_a, l_b
using vardate;
END;
使用绑定变量指定动态SQL语句并使用USING语法执行它更有效。请注意,我们仍然需要将SELECT转换为一些变量。
答案 1 :(得分:1)
在to_date
的两次调用中,您使用了两种不同的符号。我认为其中一个(第二个)是错误的。