La funzione TRUNC con TIMESTAMP

giovedì 23 dicembre 2010 alle 23:24 | Pubblicato su SQL | Lascia un commento
Tag: , , , ,

Qualche giorno fa mi è stato segnalato un problema sulla nostra applicazione, che però si verificava solo in ambiente di test presso il cliente, mentre da noi l’errore non c’era. L’errore era:

ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP

I programmatori hanno inizialmente pensato a un problema con i driver o con java, però quando ho visto la query mi è venuto subito un forte sospetto, la query conteneca una cosa analoga a questa:


... trunc(to_timestamp('25-12-2010 17:55','dd-mm-yyyy hh24:mi'))

in realtà al posto del to_timestamp c’era una parametro e  pezzo che ho riportato compariva nella clausola WHERE di una query.  Siccome mi risultava che la funziona TRUNC avesse come parametro solo tipo DATE o NUMBER (faccio riferimento ancora alla documentazione delle versione 10gR2 perché è ancora la versione che maggiormente usiamo, in realtà in questo caso il cliente adotta ancora 9iR2 ma sulla documentazione non ho visto differenze) ho subito fatto un doppio controllo, pratico:


D:\ORACLE\instantclient_11_2>sqlplus sviluppo30/Sviluppo30@perseo92

SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 23 10:12:32 2010

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle9i Release 9.2.0.8.0 - Production
JServer Release 9.2.0.8.0 - Production


PL/SQL procedure successfully completed.


Session altered.

SVILUPPO30@perseo92 > select trunc(to_timestamp('25-12-2010 17:55','dd-mm-yyyy hh24:mi')) from dual;


TRUNC(TO_TIMESTAMP(
-------------------
25-12-2010 00:00:00

Con un risultato che mi ha un po’ sorpreso, quindi ho fatto un controllo “teorico”, verificando la documentazione della 9iR2 che però per quanto riguarda la funzione TRUNC non dice nulla di diverso da quanto dice la documentazione della 10gR2.

Mi è venuto il dubbio che livelli di patchset diversi potessero influire, allora nell’ordine ho provato su una 9.2.0.6 (il più basso che ci è rimasto in sede) e su una 9.2.0.5 presso un’altro cliente con lo stesso identico risultato. Non convinto allora ho chiesto l’accesso al database di test del cliente interessato, scoprendo che si trattava di una 9.2.0.4:

SQL*Plus: Release 11.2.0.1.0 Production on Thu Dec 23 10:18:27 2010

Copyright (c) 1982, 2010, Oracle.  All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP and Oracle Data Mining options
JServer Release 9.2.0.4.0 - Production

SQL> select trunc(to_timestamp('25-12-2010 17:55','dd-mm-yyyy hh24:mi')) from dual;
select trunc(to_timestamp('25-12-2010 17:55','dd-mm-yyyy hh24:mi')) from dual
 *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected NUMBER got TIMESTAMP

Ne deduco che dalla patchset 9.2.0.5 Oracle abbia introdotto una piccola modifica alla funzione TRUNC affinché lavori anche con un parametro di tipo TIMESTAMP, cosa non documentata neppure sulla 11.2. Nel nostro caso l’errore è nato perché fino a un paio d’anni fa lavoravamo solo con tipi dato DATE, sembra si tratti di un problema incontrato da altri prima e a cui oracle ha (inspiegabilmente) posto una soluzione sua.

Da parte mia, pur ritenendo strano che si lavori ancora (fra l’altro per un progetto nuovo) con una 9.2.0.4 ho suggerito hai programmatori di correggere la query, anche per evitare possibili problemi di performance.

Lascia un commento »

RSS feed for comments on this post. TrackBack URI

Lascia un commento

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...

Crea un sito o un blog gratuitamente presso WordPress.com.
Entries e commenti feeds.

%d blogger cliccano Mi Piace per questo: