Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/03/2011, 11h29   #1
Invité régulier
 
Inscription : mars 2005
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 23
Points : 9
Points : 9
Par défaut ORA-01790 lors d'un différentiel de tables "apparemment" identiques

Bonjour,

Environnement :
====================
Oracle 11g

Problème :
====================
Code :
ORA-01790: une expression doit être du même type que l'expression qui lui correspond

Contexte :
====================
Je suis en train de mettre en place un différentiel de bases (en fait la même base à moment M et un moment M+1).
j'ai donc
- une base OLD que j'importe dans le schéma OLD
- une base NEW que j'importe dans le schéma NEW
- un schéma DIF pour le différentiel

Pour le moment j'ai réussi à automatiser le différentiel de structure entre les bases OLD et NEW ainsi que l'adaptation structurelle de OLD pour qu'elle corresponde à NEW.

cette adaptation structurelle (nécessaire car la base peut évoluer entre M et M+1 sans que je le sache) me permet alors de pouvoir faire un différentiel de données de chaque table via un MINUS comme ceci :
Code :
INSERT INTO DIF.MATABLE SELECT * FROM NEW.MATABLE minus SELECT * FROM OLD.MATABLE
Quand j'execute mon script différentiel_data sur l'ensemble des bases tout fonctionne nickel sauf pour une table où je me retrouve avec l'erreur citée ci-dessus.

Au départ je me suis dit que dans mon script différentiel_structure j'avais peut être oublié un cas de figure (du genre je prend en compte l'ajout de colonne sur une table entre M et M+1 mais pas la suppression).
Mais non ...
Et puis surtout j'ai bien comparé les tables OLD.MATABLE et NEW.MATABLE et je ne trouve pas de différence !!!!

Code :
1
2
SELECT * FROM NEW.MATABLE minus SELECT * FROM OLD.MATABLE
SQL Error: ORA-01790: une expression doit être du même type que l'expression qui lui correspond
pourtant si je fais
Code :
1
2
3
4
5
6
7
8
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM all_tab_cols 
WHERE owner='NEW' AND table_name='MATABLE'
minus
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM all_tab_cols 
WHERE owner='OLD' AND table_name='MATABLE'
> 0 rows selected
et rien non plus d'ans l'autre sens
Code :
1
2
3
4
5
6
7
8
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM all_tab_cols 
WHERE owner='OLD' AND table_name='MATABLE'
minus
SELECT column_name, data_type, data_length, data_precision, data_scale
FROM all_tab_cols 
WHERE owner='NEW' AND table_name='MATABLE'
> 0 rows selected
ce qui me fait dire que les tables dans les deux schémas sont bien identiques. D'où mon message car je ne comprends pas pourquoi ce message apparaît !!!

quelqu'un aurait une piste ?
D'avance merci
gemogof est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 12h05   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Nommez toutes vos colonnes au lieu de faire des select *.

Vous vous rendrez probablement compte que dans cette table vous avez interverti deux colonnes : (A,B) et dans l'autre (B,A).

D'ailleurs, rajoutez le column_id dans vos requêtes sur les vues systèmes pour le vérifier.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 14h40   #3
Invité régulier
 
Inscription : mars 2005
Messages : 23
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 23
Points : 9
Points : 9
Citation:
Envoyé par Waldar Voir le message
Vous vous rendrez probablement compte que dans cette table vous avez interverti deux colonnes : (A,B) et dans l'autre (B,A).

D'ailleurs, rajoutez le column_id dans vos requêtes sur les vues systèmes pour le vérifier.
C'est exact !
merci, une fois lu ça tombe sous le sens. l'ordre des colonnes doit être le même si l'on ne les précise pas en faisant un INSERT INTO table_dest select * from table_src

j'ai donc ajouté un order by column_id dans ma requête listant les colonnes sur lesquelles il y a un différentiel afin de faire les modifications structurelles dans le bon ordre.
gemogof est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h59.


 
 
 
 
Partenaires

Hébergement Web