|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Bonjour,
Des données sont chargées dans les colonnes d'une table temporaire depuis une table externe. Certains traitements sont à effectuer sur certaines colonnes avant chargement dans la table cible définitive. Je souhaiterais savoir comment implémenter le tout. Le chargement table externe vers table temporaire est ok! Simplement je souhaite savoir si je dois: 1/ Effectuer les calculs (=traitements) sur les colonnes une fois que les données sont chargées dans la table temporaire ? 2/ Ou alors dois-je implémenter les calculs à effectuer sur les colonnes en même temps qu'elles sont chargées depuis la table externe ? J'ai essayé de faire le traitement après chargement mais le programme ne semble pas aimer. Voilà la structure de mon code : 1/ Chargement dans table temporaire depuis la table externe: Code :
Code :
J'ai eu alors dans l'idée d'implémenter ces traitements directement sur les colonnes durant le processus de chargement mais cela me semble lourd et surtout je ne saurais comment faire. J'ai donc nesoin d'être guidée. Merci pour votre aide. |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 311 ![]() |
L’idée d’utiliser une table de travail en plus de la table externe est très probablement erronée.
Utiliser votre table externe comme une table normale et dites nous qu’est-ce que vous voulez faire avec vos données. Avec un exemple concret SVP. Sinon insert into provoque une exception NO_DATA_FOUND quand aucun enregistrement ne corresponde aux critères de sélection. |
|
|
10
|
|
|
#3 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Bonjour Mnitu et merci pour votre réponse,
Simplement, l'environnement telle que décrite est implémenté de la sorte. Les données sont chargées depuis des fichier CSV dans des tables externes à partir desquelles elles sont chargées dans une table de travail temporaire. Et la table temporaire à son tour charge la table de travail définitive après différents traitements. A mon niveau, je dois faire des traitements sur des données au moment où elles sont insérées dans la table temporaire avant que le traitement général ne les insère dans la table cible définitive. Un fois la table temporaire rensignée, et avant qu'elle ne soit droppée, je dois : 1/ extraire des montants à calculer depuis certaines colonnes de la table temporaire, 2/ faire des calculs sur ces montants (appliquer des taux de change) 3/ et ensuite renseigner 3 colonnes de cette même table par un update avec le résultat des calculs avant qu'elles n'aillent vers la table de destination. J'espère que mes explications sont assez claires. Merci pour votre aide. |
|
|
00
|
|
|
#4 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Par rapport à mon code précédent, suis-je sur la bonne voie en faisant un select ... into ... from ma table temporaire ?
Dois-je intégrer une boucle : Code :
Begin Loop ... end loop; EXCEPTION END; Merci d'avance. |
|
|
00
|
|
|
#5 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Bonjour,
Une fois que ma table temporaire EQUITY_TMP est chargée, Je lance le traitement suivant : Code :
Comment faire en sorte que cela fonctionne ? Merci pour votre aide. |
||
|
|
00
|
|
|
#6 | ||||
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Ca depend de comment vous creez votre table temporaire peut-etre.
Code :
Code :
|
||||
|
|
00
|
|
|
#7 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
La table temporaire existe déjà et est effectivement droppée à la fin de chaque traitement.
Le code concerné doit UPDATER certaines données. Ces données sont lues depuis la table temporaire une fois celle-ci chargée. J'ai mis en place une boucle FOR ... LOOP ... end loop; dans laquelle un UPDATE a lieu sur une des colonnes de cette table temporaire selon certaines conditions. C'est cet UPDATE qui ne fonctionne pas et je souhaiterais savoir pourquoi et que faire pour y remédier. Merci pour votre aide. |
|
|
00
|
|
|
#8 |
|
Membre expérimenté
![]() François Inscription : février 2010 Messages : 306 ![]() |
Non en fait, c'est pas ce que j'aurais voulu dire.
Si apres avoir fait l'import depuis votre table externe dans la table temporaire vous faites un commit, et que dans le create vous avez omis la clause alors ca les efface a chaque commit. Du coup pas d'update. avant de lancer votre update, faites donc un select count(*) du select a l'interieur du FOR, juste pour verifier que ce n'est pas vide. |
|
|
00
|
|
|
#9 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
La purge de la table temporaire + commit a lieu beaucoup plus loin dans la suite du traitement.
Cependant, effectivement en utilisant le debugger, je vois que le SELECT de ma boucle FOR a des données à NULL alors que dans mon fichier de test, au moins deux lignes remplissent les conditions requises pour l'UPDATE. Je me demande si mon LOOP est bien placé. Lorsque je retire la Boucle FOR, j'ai un message d'erreur me disant que le Select remonte plus d'une ligne ... Lorsque je fais en sorte de n'avoir qu'une ligne remplissant les conditions sans la boucle FOR, mon select remonte bien la ligne souhaitée et l'UPDATE a lieu. Simplement, le fichier réel peut contenir des milliers de lignes et plusieurs d'entres elles peuvent remplir les conditions d'UPDATE. Comment corriger ? Merci par avance |
|
|
00
|
|
|
#10 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Bonjour,
Mon code ci-dessous ramène l'erreur : ORA-01422: exact fetch returns more than requested number of rows Code :
Merci |
||
|
|
00
|
|
|
#11 | ||||||
|
Membre Expert
![]() Philippe CHIRCOPChef de projet Inscription : juin 2007 Messages : 1 109 ![]() |
1) Il y a une boucle inutile
2) Pas de exit dans une boucle avec curseur Ma proposition en PL/SQL Code :
Code :
Code :
__________________
Garuda गरूड Brahmâ la Guerre et Vishnu la Paix Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010 |
||||||
|
|
00
|
|
|
#12 | ||||||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
![]() Merci, Garuda ! Je tente de faire la même chose avec le code qui suit: Code :
Code :
2/ A l'exécution, j'ai le message suivant : Code :
|
||||||
|
|
00
|
|
|
#13 | ||||
|
Membre Expert
![]() Philippe CHIRCOPChef de projet Inscription : juin 2007 Messages : 1 109 ![]() |
1) Il ne faut pas mettre de into dans la section DECLARE (curseur).
L'affectation est IMPLICITE ! Code :
Code :
3) L'appel a la fonction peut être mis directement dans le SELECT 4) Encore une fois, il est inutile de faire une boucle PL/SQl. Un simple UPDATE SQL est largement faisable ( et préférable)
__________________
Garuda गरूड Brahmâ la Guerre et Vishnu la Paix Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010 |
||||
|
|
00
|
|
|
#14 | ||
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
Grand merci Garuda pour votre aide !
![]() Pour répondre à votre question: 2) A quoi sert le case puisque que le where ne selectionne que les données dont EVENT_TYPE='SPEC_DIV' Le CASE sur EVENT_TYPE sert à nous indiquer que un montant est à extraire de la chaine de caractère de la col TERMS. J'ai appliqué votre solution, simplement à l'exécussion, malgré le curseur, j'ai toujours ce message d'erreur : Code :
|
||
|
|
00
|
|
|
#15 | ||
|
Membre Expert
![]() Philippe CHIRCOPChef de projet Inscription : juin 2007 Messages : 1 109 ![]() |
Le case ne sert à rien car les lignes selectionnées répondront toujours au case !
L'erreur ne peut pas se trouver dans le code que j'ai envoyé car il n'a pas de SOUS-REQUETE ! Code :
__________________
Garuda गरूड Brahmâ la Guerre et Vishnu la Paix Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010 |
||
|
|
00
|
|
|
#16 |
|
Candidat au titre de Membre du Club
![]() Inscription : décembre 2004 Messages : 60 ![]() |
L'erreur ne se trouvait effectivement pas dans le code; il s'agissait d'un ancien code Select qui gênait. Une fois retiré, tout fonctionne merveilleusement !
Grand Grand Merci!
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com