Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > ETL > Talend
Talend Forum d'entraide sur Talend (Talend Open Studio, ...). Avant de poster --> FAQ Talend, Tutoriels Talend
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, 10h14   #1
Invité régulier
 
Inscription : janvier 2011
Messages : 100
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 100
Points : 7
Points : 7
Par défaut Error ORA-00001: violation de contrainte unique

Bonjour

Je dois générer une clé pour chaque ligne de mon fichier, pour cela j'ai rajouter un champs et je lui ai attribué cette méthode ""+Numeric.sequence("s1",1,1); parce que ma clé doit être de type chaine de caractère.

lorsque je lance le job, il me met cette error :
Citation:
statistics] connecting to socket on port 3915
[statistics] connected
ORA-00001: violation de contrainte unique
..SYS_C0012094)
[statistics] disconnected
Aurez vous une idée SVP, ???

Je suis vraiment débutante en Talend

Mercii beaucoup
delilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2011, 10h25   #2
Rédacteur/Modérateur
 
Avatar de jsd03
 
Jean-Sébastien DARGES
Consultant décisionnel
Inscription : août 2008
Messages : 983
Détails du profil
Informations personnelles :
Nom : Jean-Sébastien DARGES
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant décisionnel

Informations forums :
Inscription : août 2008
Messages : 983
Points : 1 845
Points : 1 845
Bonjour

La réponse semble être simple :

Ta table doit déjà contenir des lignes avec un champ égale à ""+Numeric.sequence("s1",1,1).

Illustration pour 2 lignes :

Première alimentation :
- Ta table est vide
- l'insertion se fait sans problème et tu obtiens dans ta table :
Code :
1
2
"1";...;...
"2";...;...
Deuxième alimentation :
- ta table contient les enregistrements de l'alimentation précédentes
- l'insertion plante car tu essaies d'insérer une seconde fois :
Code :
1
2
"1";...;...
"2";...;...
Alors que ta colonne à une contrainte unique et que les données sont déjà présentes.

Il faut que tu génère une valeur unique pour ta colonne. Il faudrait que tu utilises une séquence Oracle et que tu passes ton champ en NUMBER. Si tu ne peux pas le faire, en début de traitement, il faut que tu récupères le max de ta colonne pour repartir de ce chiffre (qui est un VARCHAR2() à l'origine de cette manière :

Code :
1
2
SELECT nvl(max(to_number(ta_colonne), 0) MAX_VAL
FROM ta_table
Ensuite tu utilises ce chiffre dans ta séquence:

Code :
""+Numeric.sequence("s1",MAX_VAL,1).
Du coup lors de la deuxième alimentation tu auras :
Code :
1
2
3
4
"1";...;...
"2";...;...
"3";...;...
"4";...;...
Et donc plus de problème de contrainte unique
__________________
Google est ton ami mais ton voisin aussi

Modérateur BI
Mes tutoriels - FAQ Talend - FAQ SQL*Plus

Suivez @Developpez sur twitter !
jsd03 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/03/2011, 10h35   #3
Invité régulier
 
Inscription : janvier 2011
Messages : 100
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 100
Points : 7
Points : 7
ça me génère une erreur

Citation:
3 ;
SELECT nvl(max(to_number(SYSID), 0) MAX_VAL
*
ERREUR Ó la ligne 1 :
ORA-00909: nombre d'arguments non valide

As tu une idée stp ?

Merciii bcq

MERCI beaucoup

ça marche

TU m'a sauvé la vie, j'ai plus le pb de violation de contrainte

Encore merci
delilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h34   #4
Invité régulier
 
Inscription : janvier 2011
Messages : 100
Détails du profil
Informations forums :
Inscription : janvier 2011
Messages : 100
Points : 7
Points : 7
Salut


C'est vrai la solution marche bien

Mais je dois a chaque fois changer la valeur (VAL) qu'on donne Numeric.sequence("s1",VAL,1).

ALors que mon but et de générer périodiquement mon Job, donc je ne sais pas comment je fais pour que la Val change automatiquement en lançant le job, sinon ce que j'ai fait ne convient pas à ce qu'on me demande

As tu une solution STP ???


Merci beaucoup
delilou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 17h26   #5
Rédacteur/Modérateur
 
Avatar de jsd03
 
Jean-Sébastien DARGES
Consultant décisionnel
Inscription : août 2008
Messages : 983
Détails du profil
Informations personnelles :
Nom : Jean-Sébastien DARGES
Localisation : France, Indre et Loire (Centre)

Informations professionnelles :
Activité : Consultant décisionnel

Informations forums :
Inscription : août 2008
Messages : 983
Points : 1 845
Points : 1 845
Il te suffit dans le même job de faire :

1 : créer une variable de context dans ton job par exemple MAX_VAL de type int initialisé à 1
2 : tOracleInput relié à un tContextLoad avec la requête suivante :
Code :
1
2
SELECT 'MAX_VAL' AS KEY, max(nvl(to_number(colonne), 1)) AS value
FROM matable
3 : relier ce sous job avec un onSubjobOk qui part du tOracleInput au traitement que tu veux faire.
4 : lors de l'utilisation de la méthode Numeric.sequence() utilise là de cette façon :
Code :
""+Numeric.sequence("s1", context.MAX_VAL, 1)
Conclusion : à chaque nouveau chargement, la valeur maximum de ta colonne est chargée dans la variable de contexte MAX_VAL qui est utilisée pour initialiser la séquence Talend.
__________________
Google est ton ami mais ton voisin aussi

Modérateur BI
Mes tutoriels - FAQ Talend - FAQ SQL*Plus

Suivez @Developpez sur twitter !
jsd03 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 18h56.


 
 
 
 
Partenaires

Hébergement Web