pl/sql - to_date 不适用于立即执行参数
我希望能够像这样执行下面的过程:
exec procname('29-JAN-2011');
过程代码是:
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');
i wanna be able to execute my below proc like so:
exec procname('29-JAN-2011');
proc code is:
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;
It keeps throwing error:
ORA-00904: "JAN": invalid identifier.
It compiles, but it throws the error when I run this command:
EXEC procname('29-JAN-2011');
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您声明一个将输入参数转换为日期的变量:为什么不使用它呢?
此外,应用于日期的 TRUNC() 会删除时间元素。你在这里不需要它,因为你传递的值没有时间。
因此,您的代码应该是:
使用绑定变量指定动态 SQL 语句并使用 USING 语法执行它会更高效。请注意,我们仍然需要选择一些变量。
You declare a variable which casts the input parameter to a date: why not use it?
Also, the TRUNC() applied to a date removes the time element. You don't need it here because the value you're passing has no time.
So, your code should be:
Specifying the dynamic SQL statement with a bind variable and executing it with the USING syntax is a lot more efficient. Note that we still have to SELECT into some variables.
您在对
to_date
的两次调用中使用了两种不同的表示法。我认为其中之一(第二个)是错误的。You're using two different notations in the two calls to
to_date
. I think one of them (the second) is wrong.