Domanda

Client compilato con OCI: 10.2.0.4.0
Server: Oracle9i Enterprise Edition Release 9.2.0.4.0

La query problematica è:

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

Descrizione tabella:

SQL>describe LOG;

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

Per quanto semplice come potrebbe sembrare, quando eseguito direttamente sul server con SQLPlus, esso restituisce un risultato, ma quando eseguito dalla applicazione che utilizza OCI, questa query restituisce OCI_NO_DATA sempre . In principio, il valore di data è stato anche un segnaposto, ma ho scoperto che anche dando un letterale come '05-JUL-08' non ha funzionato. Ho provato la seguente:

  • Ho provato le basi: interrogando il DB dal client funziona. E 'questo quello che mi dà fastidio
  • Il seguente funziona:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • L'esecuzione ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY"; prima che la query sia il server e il client. Stesso risultato: restituisce i dati del server, client OCI_NO_DATA

  • provato a cambiare il formato DATE_PROC, combinando questo con l'uso di TO_DATE(). Stesso risultato.
  • cercato, cercato, cercato. Non risponde

Sono un po 'alla disperata ricerca di una risposta, apprezzerebbe qualsiasi aiuto e in grado di fornire il maggior numero di ulteriori dettagli, se necessario. Grazie.

--- Ulteriori informazioni ---

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

Ho provato diverse combinazioni utilizzando trunc () e "alter session set NLS_DATE_FORMAT" ... e questo è ciò che ho:

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

In Server: Ritorni: "BancoOne" (un buon rapporto)
In OCI app: Restituisce OCI_NO_DATA

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

In Server: Ritorni:
"BancoOne" In OCI app: Consegna "BancoOne"

Quindi il punto è, perché è l'applicazione OCI dando risultati diversi se entrambi stanno accedendo alla stessa DB server?

Inoltre, per chiarire lo scopo dell'app OCI: ha una query per essere configurato dall'utente. L'idea è che l'utente si adatterà la query, se lo desideri per adattarsi con il campo Data presente nel DB di destinazione, è per questo che non dovrei includere "alter session set NLS_DATE_FORMAT" dichiarazioni nel mio codice, come io non conoscerò il formato della data. In questo modo voglio fornire flessibilità per l'utente, e non si basano su formati di data specifici. Questo ha senso? Qualche suggerimento?

È stato utile?

Soluzione

tuo DATE_PROC colonna è una data, si dovrebbe sempre confrontarlo con una data e non contare sulla conversione dei dati implicita.

Prova questo:

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

o questo:

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

Se è possibile, evitare di utilizzare un formato di data nel codice che utilizza le lettere per mesi (perché il codice di non riuscirà quando si modifica la lingua di default) e solo due caratteri per anni (ambiguità del secolo). Mi piace usare 'YYYY/MM/RR' perché questo formato saranno ordinati come la data originale.

Altri suggerimenti

Come sono stati inseriti i record?

campi Data fanno archivio di informazioni di tempo e, quindi, quando si inseriscono record utilizzando sysdate, il campo data conterrà "valori" diversi per i record all'interno di quel giorno. Quando si esegue date_proc = '05 -JUL-08' , si sta dicendo dove date_proc è esattamente uguale al 5 luglio 2008 a 00:01:00. Se si è inserito il record alle 12:01 con sysdate, non verrà restituito. Hai provato a usare un mezzo o trunc?

Ecco un esempio:

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

Direi che si sta ponendo la domanda sbagliata.

Oracle si basa sulla condivisione di SQL per le prestazioni e quando ti infili una stringa in, come '20.080.705', l'SQL non può essere condivisa. Dettagli qui .

Quindi il valore di dati dovrebbe essere un segnaposto e dovrebbe essere del tipo di dati corretto (DATE). L'esempio qui dovrebbe aiutare a farlo.

Detto questo, se questo funziona

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

, ma questo non lo fa

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

Sarei cercando

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

Abbiamo appena avuto questo errore (OCI_NO_DATA) ottenere causato da qualcuno che cambia l'ora del giorno sul proprio PC. Quando hanno messo la data / ora di nuovo al momento giusto, l'applicazione ha iniziato a lavorare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top