我对在Oracle中正确使用带有日期的绑定变量感到困惑。这不在数据库中或使用PL / SQL时,而是在通过OCI接口与Oracle交互时,其中日期需要使用 to_date 函数作为字符串传递。
我认为确保正确使用绑定变量的正确方法是执行以下操作:
to_date(:my_date, :my_date_format)
但是,我已经看到了使用绑定没有完成日期格式的方法,所以我有点困惑。
任何人都可以证实这一点或建议最佳方法吗?
答案 0 :(得分:1)
日期格式是否恒定?或者它是否在运行时发生变化?
通常,您知道字符串的格式(至少是预期的),因此日期格式将是常量。如果某些东西是常量,则没有必要使它成为一个绑定变量,它只能被硬编码为语句的一部分。在这种情况下,无论哪种方式都无关紧要,但有些情况下您宁愿在SQL语句中对值进行硬编码,因为您希望为优化器提供更多信息(想想一下您的数据偏差很大的列)总是在寻找特定的硬编码值。
另一方面,如果日期格式在运行时发生变化,因为有人将日期的字符串表示形式和字符串所在的格式都传递给您的过程,那么将日期格式作为绑定变量是有意义的
答案 1 :(得分:0)
你的问题的答案取决于......
如果您正在动态创建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的情况下为您解决此问题(我不确定,从未使用过它。)