问题描述
|
我想能够像下面这样执行我的下面的proc:
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\');
解决方法
您声明一个将输入参数强制转换为日期的变量:为什么不使用它呢?
同样,应用于日期的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语法执行它会更有效率。注意,我们仍然必须选择一些变量。
, 您在两次调用to_date
时使用了两种不同的表示法。我认为其中一个(第二个)是错误的。