我们有一个使用Oracle时间戳的ColdFusion 8(Linux)应用程序。我们刚刚从10g转换为Oracle 11g,我们现在在数据源上使用Oracle的瘦客户端。我们在选择了时间戳列的应用程序中收到错误。
似乎正在返回类oracle.sql.TIMESTAMP
的对象。我通过转储列的内容来验证这一点。果然,它让我分解了对象的方法及其返回类型。但是,我似乎无法直接与此对象接口:
<cfquery name="getstuff" ...>
SELECT timestampfld ...
FROM myTable
</cfquery>
getstuff.timestampfld
包含一个对象。但是,这样做:
<cfoutput query="getstuff">
#timestampfld.stringValue()#
#timestampfld.dateValue()#
</cfoutput>
产生的错误表明无法找到这些方法。如何获取该对象中的数据?
从评论中更新:
当我获取列值并将DateFormat()
函数应用于它时。 CF错误是“值类oracle.sql.timestamp无法转换为日期”。当我执行<cfoutput>
时,我得到了类定义。
在检索到的列中,我似乎得到一个对象而不是一个字符串。当我cfdump列时,我得到oracle.sql.TIMESTAMP的OBJECT。转储列出了可用的方法和字段。当我cfout输出相同的变量时,会显示一个字符串。当我尝试对变量执行DataFormat()
时,它会抱怨它不是日期。
答案 0 :(得分:1)
我只是在开发过程中偶然发现了这个错误。我在过去有过,从那时起就被遗忘了。
我知道两种缓解方法:
第一个是根据关于不同上下文中相同错误消息的问题的 answer。
可以将以下内容添加到 jvm.config
文件
-Doracle.jdbc.J2EE13Compliant=true
第二个不是返回一个 Oracle TIMESTAMP 列而是 CAST 它做 DATE,首先,像
<cfquery name="getstuff" ...>
SELECT CAST( timestampfld as DATE ) timestampfld
FROM myTable
</cfquery>
老实说,我对两者都不满意。当忘记 JVM 参数时,软件会崩溃。另一方面,CAST 可能会影响 SQL 的工作方式。