【发布时间】:2010-01-15 12:38:12
【问题描述】:
使用 OCI 编译的客户端:10.2.0.4.0
服务器:Oracle9i Enterprise Edition Release 9.2.0.4.0
有问题的查询是:
SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = '05-JUL-08'
表格说明:
SQL>describe LOG;
TEL NOT NULL VARCHAR2(15)
CODIGO NOT NULL VARCHAR2(20)
DATE_PROC NOT NULL DATE
看起来很简单,当直接在服务器上使用 SQLPlus 执行时,它会返回一个结果,但是当从使用 OCI 的应用程序中执行时,此查询会返回 OCI_NO_DATAalways。一开始,日期值也是一个占位符,但我发现即使给出像 '05-JUL-08' 这样的文字也不起作用。我尝试了以下方法:
- 我已经尝试了基础知识:从客户端查询数据库确实有效。就是这个给我带来了麻烦
-
以下确实有效:
SELECT CODIGO FROM LOG WHERE TEL = :telnumber 在服务器和客户端的查询之前执行
ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY";。结果相同:服务器返回数据,客户端OCI_NO_DATA- 尝试更改
DATE_PROC格式,并结合使用TO_DATE()。结果相同。 - 搜索,搜索,搜索。没有答案
我有点急于找到答案,希望能提供任何帮助,并且可以根据需要提供尽可能多的详细信息。谢谢。
--- 更多信息 ---
update log set DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS') where CODIGO='BancoOne';
我使用 trunc() 和“alter session set nls_date_format”尝试了不同的组合......这就是我得到的:
SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');
在服务器中:返回:“BancoOne”(物有所值)
在 OCI 应用中:返回 OCI_NO_DATA
SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');
在服务器中:返回:“BancoOne”
在 OCI 应用中:返回“BancoOne”
所以重点是,如果 OCI 应用程序都访问同一个数据库服务器,为什么会给出不同的结果?
此外,为了阐明 OCI 应用程序的目的:它有一个由用户配置的查询。这个想法是用户将根据需要调整查询以适应目标数据库中存在的日期字段,这就是为什么我不应该在我的代码中包含“alter session set nls_date_format”语句,因为我不知道日期格式。这样我想为用户提供灵活性,而不是依赖特定的日期格式。这有意义吗?有什么建议吗?
【问题讨论】:
标签: oracle date where oracle-call-interface clause