Pregunta

Cliente compilado con OCI:10.2.0.4.0
Servidor:Oracle9i Enterprise Edition versión 9.2.0.4.0

La consulta problemática es:

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = '05-JUL-08'

Descripción de la tabla:

SQL>describe LOG;

TEL NOT NULL VARCHAR2(15)
CODIGO NOT NULL VARCHAR2(20)
DATE_PROC NOT NULL DATE

Por más simple que parezca, cuando se ejecuta directamente en el servidor con SQLPlus, devuelve un resultado, pero cuando se ejecuta desde la aplicación que usa OCI, esta consulta devuelve OCI_NO_DATA siempre.Al principio, el valor de fecha también era un marcador de posición, pero descubrí que incluso dando un valor literal como '05-JUL-08' no funcionó.He probado lo siguiente:

  • Probé lo básico:consultar la base de datos desde el cliente funciona.Es este el que me da problemas.
  • Lo siguiente funciona:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • ejecutando ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY"; antes de la consulta tanto en el servidor como en el cliente.Mismo resultado:servidor devuelve datos, cliente OCI_NO_DATA

  • Intenté cambiar DATE_PROC formato, combinándolo con el uso de TO_DATE().Mismo resultado.
  • Busqué, busqué, busqué.Sin respuesta

Estoy un poco desesperado por encontrar una respuesta, agradecería cualquier ayuda y puedo proporcionar tantos detalles adicionales como sea necesario.Gracias.

--- Informacion adicional ---

update log set DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS') where CODIGO='BancoOne';

He probado diferentes combinaciones usando trunc() y "alterar el conjunto de sesiones nls_date_format"...y esto es lo que obtengo:

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

En servidor:Devoluciones:"BancoOne" (buena relación calidad-precio)
En la aplicación OCI: Devuelve OCI_NO_DATA

SELECT CODIGO FROM LOG WHERE TEL = 11223344 AND trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

En servidor:Devoluciones:"BancoOne"
En la aplicación OCI:Devuelve "BancoOne"

Entonces, la cuestión es, ¿por qué la aplicación OCI da resultados diferentes si ambos acceden al mismo servidor de base de datos?

Además, para aclarar el propósito de la aplicación OCI:tiene una consulta a configurar por el usuario.La idea es que el usuario adapte la consulta como desee para que se ajuste al campo Fecha presente en la base de datos de destino, es por eso que no debo incluir declaraciones "alterar sesión establecer nls_date_format" en mi código, ya que no sabré el formato de fecha.De esta manera quiero brindar flexibilidad al usuario y no depender de formatos de fecha específicos.¿Esto tiene sentido?¿Alguna sugerencia?

¿Fue útil?

Solución

DATE_PROC su columna es una fecha, debe siempre compararlo con una fecha y no confiar en la conversión de datos implícita.

Prueba esto:

SELECT CODIGO FROM LOG WHERE TEL = :telnumber AND DATE_PROC = DATE '2008-07-05'

o esto:

SELECT CODIGO 
  FROM LOG 
 WHERE TEL = :telnumber 
   AND DATE_PROC = to_date('05-JUL-08', 'DD-MON-RR')

Si es posible, se abstengan de utilizar un formato de fecha en el código que utiliza cartas durante meses (porque el código se producirá un error cuando se cambia el idioma por defecto) y sólo dos caracteres para años (ambigüedad de siglo). Me gusta usar 'YYYY/MM/RR' porque este formato será clasificada como la fecha original.

Otros consejos

¿Cómo se insertan los registros?

Los campos de fecha hacen almacén de información de tiempo, y por lo tanto al insertar registros utilizando sysdate, el campo de fecha contendrán diferentes "valores" para los registros dentro de ese día. Cuando se ejecuta date_proc = '05 -JUL-08' , que están diciendo donde date_proc iguala exactamente el 5 de julio de 2008 a las 12:01:00. Si ha insertado el registro a las 12:01 con sysdate, no será devuelto. ¿Ha intentado utilizar un medio o trunc?

Aquí es un ejemplo:

drop table test_date;
create table test_date (id number, ud date);

insert into test_date values (1, '15-jan-10');
insert into test_date values (2, '15-jan-10');
insert into test_date values (3, '15-jan-10');
insert into test_date values (6, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (7, sysdate);    -- sysdate as of writing is 15-JAN-2010 08:01:55
insert into test_date values (8, '16-jan-10');
commit;

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where ud = '15-jan-10';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00      

select id, ud, to_char(ud, 'dd-MON-yyyy HH:MM:SS') from test_date where trunc(ud) = '15-jan-2010';
---------------------- ------------------------- --------------------
1                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
2                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
3                      15-JAN-10                 15-JAN-2010 12:01:00                                                        
6                      15-JAN-10                 15-JAN-2010 08:01:55                                                        
7                      15-JAN-10                 15-JAN-2010 08:01:55

Yo diría que usted está haciendo la pregunta equivocada.

Oracle se basa en el intercambio de SQL para el rendimiento y cuando se cumple una cadena en, como '20080705', el SQL no puede ser compartida. Detalles aquí .

Así que el valor de los datos debe ser un marcador de posición y debe ser del tipo de datos correcto (FECHA). El ejemplo aquí debería ayudar a hacer eso.

Una vez dicho esto, si esto funciona

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

pero esto no lo hace

SELECT CODIGO FROM LOG 
WHERE TEL = 11223344 
AND DATE_PROC = TO_DATE('20080705162918', 'YYYYMMDDHH24MISS');

estaría tratando

SELECT TO_CHAR(DATE_PROC,'DD-MM-YYYY HH24:MI:SS') FROM LOG 
WHERE TEL = 11223344 AND 
trunc(DATE_PROC) = TO_DATE('20080705', 'YYYYMMDD');

Acabamos de tener este error (OCI_NO_DATA) obtener causada por alguien cambiar la hora del día en su pc. Cuando pusieron la fecha / hora de regreso al momento adecuado, la aplicación comienza a trabajar bien.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top