Question

Client compilé avec OCI: 10.2.0.4.0
Serveur: Oracle9i Enterprise Edition de presse 9.2.0.4.0

La requête est problématique:

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

Tableau Description:

SQL>describe LOG;

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

Aussi simple que cela peut paraître, lorsqu'il est exécuté directement sur le serveur avec SQLPlus, il renvoie un résultat, mais lorsqu'il est exécuté à partir de l'application qui utilise OCI, cette requête retourne OCI_NO_DATA toujours . Au début, la valeur de date a également été un espace réservé, mais je trouve que même en donnant un littéral comme '05-JUL-08' ne fonctionnait pas. Je l'ai essayé ce qui suit:

  • J'ai essayé les bases: la base de données de l'interrogation du client fonctionne. Il est celui qui me donne du mal
  • Ce qui suit fonctionne:

    SELECT CODIGO FROM LOG WHERE TEL = :telnumber
    
  • L'exécution ALTER SESSION SET NLS_DATE_FORMAT="DD-MM-YYYY"; avant que la requête dans le serveur et le client. Le même résultat: renvoie les données du serveur, OCI_NO_DATA client

  • essayé de changer le format de DATE_PROC, combinant cela avec l'utilisation de TO_DATE(). Le même résultat.
  • recherché, recherché, recherché. Pas de réponse

Je suis un peu désespéré de trouver une réponse, apprécierait toute aide et peut fournir autant de détails supplémentaires au besoin. Merci.

--- Plus d'infos ---

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

J'ai essayé différentes combinaisons en utilisant trunc () et « modifier session de jeu NLS_DATE_FORMAT » ... et voici ce que je reçois:

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

serveur: retour: "BancoOne" (bonne valeur)
Dans l'application OCI: Retourne OCI_NO_DATA

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

serveur: retour:
"de BancoOne" Dans l'application OCI: Returns "BancoOne"

Ainsi, le point est, pourquoi l'application OCI des résultats différents envoie-deux accèdent au même serveur DB?

En outre, pour préciser l'objet de l'application OCI: il a une requête pour être configuré par l'utilisateur. L'idée est que l'utilisateur adaptera la requête comme pour une adaptation parfaite avec le champ Date présent dans le DB de destination, c'est pourquoi je ne devrais pas inclure des déclarations « modifier session de jeu de NLS_DATE_FORMAT » dans mon code, comme je ne veux pas connaître le format de date. De cette façon, je veux donner une flexibilité à l'utilisateur, et ne comptez pas sur les formats de date spécifiques. Est-ce que ça a du sens? Toutes les suggestions?

Était-ce utile?

La solution

votre DATE_PROC colonne est une date, vous devez toujours comparer à une date et jamais appuyer sur la conversion de données implicite.

Essayez ceci:

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

ou ceci:

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

Si vous pouvez, évitez d'utiliser un format de date dans votre code qui utilise des lettres pendant des mois (parce que le code échouera lorsque vous modifiez la langue par défaut) et seulement deux caractères pour les années (ambiguïté du siècle). J'aime utiliser 'YYYY/MM/RR' car ce format sera triée comme la date initiale.

Autres conseils

Comment ont été les enregistrements insérés?

Les champs de date font l'information de temps de stockage, et donc lors de l'insertion enregistrements à l'aide sysdate, le champ de date contiendront différentes « valeurs » pour les enregistrements dans ce jour-là. Lorsque vous exécutez date_proc = '05 -juil-08' , vous dites où date_proc est exactement égale le 5 Juillet 2008 à 12:01:00. Si vous insérez le disque à 12:01 avec sysdate, il ne sera pas retourné. Avez-vous essayé d'utiliser un ou entre trunc?

Voici un exemple:

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

Je dirais que vous posez la mauvaise question.

Oracle repose sur le partage SQL pour des performances et quand vous vous en tenez une chaîne, comme « 20080705 », le SQL ne peut pas être partagée. Détails .

Ainsi, la valeur des données doit être un espace réservé et doit être du bon type de données (DATE). L'exemple devrait aider à le faire.

Cela dit, si cela fonctionne

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

mais cela ne pas

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

Je tenterai

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

Nous avons juste eu cette erreur (OCI_NO_DATA) se fait par une personne de changer l'heure de la journée sur leur PC. Quand ils ont mis la date / heure de retour au bon moment, l'application a commencé à travailler sur OK.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top