使用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_DATA
always。一开始,日期值也是一个占位符,但我发现即使给出一个字面值'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”语句,因为我不知道日期格式。这样我想为用户提供灵活性,而不是依赖特定的日期格式。这有意义吗?有什么建议么?