在 Oracle 中正确使用带日期的绑定变量?
Posted
技术标签:
【中文标题】在 Oracle 中正确使用带日期的绑定变量?【英文标题】:Correct use of bind variables with dates in Oracle? 【发布时间】:2012-01-26 15:21:20 【问题描述】:我对在 Oracle 中正确使用带有日期的绑定变量感到困惑。这不是在数据库中或在使用 PL/SQL 时,而是在通过 OCI 接口与 Oracle 交互时,需要使用 to_date 函数将日期作为字符串传入。
我认为确保正确使用绑定变量的正确方法是执行以下操作:
to_date(:my_date, :my_date_format)
但是,我看到了不使用绑定完成日期格式的方法,所以我有点困惑。
谁能证实这一点或建议最好的方法?
【问题讨论】:
你能描述一下你想要做什么以及错误是什么吗? @FlorinGhita,没有错误。想象一个网页,用户在其中选择一个日期。它被传递到一个报告中,该报告根据该日期的值返回数据。数据由带有 WHERE 子句的 SQL 查询生成,该子句过滤日期。我想确保 WHERE 子句使用绑定变量。 【参考方案1】:日期格式是常数吗?还是在运行时发生变化?
通常,您知道字符串的格式(至少是预期的),因此日期格式将是一个常量。如果某物是常量,则无需将其设为绑定变量,只需将其硬编码为语句的一部分即可。在这种情况下,无论哪种方式都无关紧要,但在某些情况下,您希望在 SQL 语句中硬编码该值,因为您想为优化器提供更多信息(想想一个具有高度倾斜数据的列,您'总是在寻找一个特定的硬编码值)。
另一方面,如果日期格式在运行时发生更改,因为有人将日期的字符串表示形式和字符串的格式都传递给您的过程,那么将日期格式作为绑定变量是有意义的.
【讨论】:
谢谢贾斯汀。该日期格式不会改变。你所说的硬编码是有道理的。除此之外,使用带有 to_date 的绑定变量是正确的方法吗? @BrianFenton - 绑定变量应该用在数据在运行时发生变化的地方。如果日期格式没有改变,我不会使用绑定变量。但是,在这种情况下,无论从功能还是性能的角度来看,这都无关紧要。【参考方案2】:您的问题的答案取决于...
如果您正在动态创建 date_format,那么您应该使用绑定变量来确保自己的 SQL 注入安全。如果您没有动态创建日期格式,那么它已经是硬编码的,没有什么意义。
select to_date(:my_date,'yyyymmdd') from dual
无论如何都是安全的,但是:
select to_date(:my_date,:my_date_format) from dual
应该真的是一个绑定。
这都是假设 :my_date 不是一个列,在这种情况下它根本不能是一个绑定变量。
如果您绑定 :my_date
尽管您将静态日期传递给 Oracle 并且不使用列,那么 OCI 无法在不访问 Oracle 的情况下为您解决此问题(我不确定,永远不会用过)。
【讨论】:
以上是关于在 Oracle 中正确使用带日期的绑定变量?的主要内容,如果未能解决你的问题,请参考以下文章
Oracle“ORA-01008:并非所有变量都绑定”错误带参数
在 to_date 函数中使用 cx_oracle 变量时无法正确绑定
Toad For Oracle:未声明绑定变量“End_Year”