Bonjour,
j'essaye d'éviter un warning lorsque je recopie une table dans une autre, avec une petite conversion en route.
je dispose de deux tables :
* tab1("myid" : NUMBER(3), "mydate" : DATE)
* tab2("myid" : NUMBER(3), "mydate" : NUMBER(8)), où la date est sous forme YYYYMMDD
Je veux recopier tab2 vers tab1, j'ai donc une requête du type :
Mais à la compilation, j'obtiens un warning plw-07202 : "le type bind entrainera la conversion à partir du type de la colonne".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 INSERT INTO tab1(myid, mydate) SELECT myid, TODATE_(mydate, 'yyyymmdd') FROM tab2
D'après ce que j'ai compris, ce warning vise à éviter l'appel de fonctions à l'intérieur de requêtes SQL, car on risque de ne pas utiliser les index. Par exemple dans une requête du type :
si tab1 est indexée sur le champ mydate, on n'utilisera pas l'index car la colonne sera d'abord convertie en number (et on ne dispose pas d'index sur mydate convertie en nombre).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 SELECT myid FROM tab1 WHERE TO_NUMBER(TO_CHAR(mydate, 'yyyymmdd')) = 20080101
Mais dans mon cas, la seule solution que je vois pour ne pas appeler TO_DATE à l'intérieur de ma requête, est de :
- faire une première requête de select from tab2, avec un bulk collect dans un tableau
- parcourir ce tableau et le recopier en convertissant la date à l'intérieur d'un nouveau tableau
- insérer le nouveau tableau créé via un forall à l'intérieur de la table tab1
Il me semble que ça revient à beaucoup compliquer la requête, et probablement diminuer les performances....?
Si vous avez un avis ou une autre idée pour éviter ce warning je suis preneur
Merci
Partager