Bonjour,
Je dois créer une procédure PL/SQL permettant de copier les données de civil.personne vers institut.etudiant.
Cette procédure prend en paramètre (date_appel, file_name)
Version imprimable
Bonjour,
Je dois créer une procédure PL/SQL permettant de copier les données de civil.personne vers institut.etudiant.
Cette procédure prend en paramètre (date_appel, file_name)
Qu'as-tu déjà essayé ?
Quel problème rencontres-tu ?
Tu veux pas qu'on fasse tes devoirs aussi ? :aie:
A part ça, on connait pas les tables, que vient faire un file_name là-dedans ? Elle sert à quoi la date d'appel ?
C'est n'importe quoi là, comment veut-tu qu'on t'aide avec si peu d'info ? :roll:
En fait j'ai essayé quelques codes. Entre autre:
Mais cela ne marche pas parce qu'il s'agit de deux tables differentesCode:
1
2
3
4
5
6 CREATE or replace PROCEDURE copie_infos BEGIN INSERT INTO etudiant ( SELECT date_appel, file_name FROM personne); END/
Pour tester, toujours exécuter ta requête en dehors de ta procédure stockée.
Les messages d'erreurs seront mieux remonter par ton client Oracle.
Ensuite, une recherche Google avec les mots "Oracle select insert" te donne la solution :
http://docs.oracle.com/cd/E17952_01/...rt-select.html
Je ne veux pas que tu fasse mes devoirs, c'est juste que c'est la première fois que j'utilise Oracle donc je suis encore en phase apprentissage.
Tout ce que je demande c'est comment modifier mon code pour copier les données entre deux tables qui appartiennent a deux bases différentes.
Tu as deux problématiques ici.
1. Apprendre comment copier des données d'une table à une autre. En dehors de la syntaxe, ce n'est pas une spécificité Oracle
2. Apprendre à faire une procédure stockée.
Fais le pas à pas :ccool:
Faudrait commencer par lire cet excellent tuto : http://sheikyerbouti.developpez.com/pl_sql/
Ensuite, proposer le code que tu testes après avoir cherché un minimum notamment sur Google ce que les messages d'erreurs signifient et évidemment, nous décrire le problème le cas échéant. "Ca ne marche pas" ne veut rien dire.
j'ai essayé ce code:
Code:
1
2
3
4
5
6
7 create or replace procedure copie_infos is begin insert into institut.etudiant (id, file_name, date_appel) select msisdn, file_name, timestamp from civil.personne; commit; end;
Aucun message d'erreur ne s'affiche quand j’exécute ce code.
Le problème est que quand je tape F5 aucune ligne ne s'ajoute a la table etudiant.
Que dois-je faire????
Encore une fois, exécute :
En dehors de la procédure stockée, et regarde ce qu'il se passe.Code:
1
2
3 INSERT INTO institut.etudiant (id, file_name, date_appel) SELECT msisdn, file_name, timestamp FROM civil.personne;
J'ai bien suivi tes instructions, Isythiel, et j'ai essayé quelques petites choses. Par exemple:
=> deux tables de la même base: ça marcheCode:
1
2
3 insert into exemple (id, file_name, date_appel) select identifiant, mail, naissance from premier;
Par contre, quand j'essaye:
=> deux tables de la même base: ça ne marche pasCode:
1
2
3
4
5
6 create or replace procedure copie_infos is begin insert into exemple (id, file_name, date_appel) select identifiant, mail, naissance from premier; end;
et là non plus:
=> deux tables dans deux bases différentes: ça ne marche pasCode:
1
2
3 INSERT INTO institut.etudiant (id, file_name, date_appel) SELECT login, file_name, timestamp FROM civil.personne;
je n'arrive toujours pas a mettre la main sur l'erreur
Comment exécute-tu ta procédure ?
Quand je dis "ça ne marche" je veux dire qu'il s’exécute normalement sans aucun message d'erreur. mais quand j'actualise la table, elle reste vide.
et concernant le "select" je suppose qu'il retourne les lignes puisque quand te tape le code ci-dessous la table est remplie.
Isythiel, j'execute la procedure en tapant shift-F9 (j'utilise TOAD FOR ORACLE)Code:
1
2
3 INSERT INTO exemple (id, file_name, date_appel) SELECT identifiant, mail, naissance FROM premier;
[On part de loin là :mouarf::ccool:]
shift-F9 ==> Va simplement compiler votre procédure
Une fois compilée : Lancer la commande
:aie:Code:Execute copie_infos
Et avec un COMMIT ?
Grâce à vous tous, je sens que je suis sur la bonne voie.
J'ai tapé ce code:
Puis:Code:
1
2
3
4
5
6
7 create or replace procedure copie_infos is begin insert into exemple (id, file_name, date_appel) select identifiant, mail, naissance from premier; commit; end;
Quand je rafraîchis la table exemple, les données s'ajoutent.Code:Execute copie_infos
par contre, quand il s'agit de deux tables dans deux bases différentes (après avoir vidé la table bien sûr) :
OK, tout va bienCode:
1
2
3
4
5
6
7 create or replace procedure copie_infos is begin INSERT INTO institut.etudiant (id, file_name, date_appel) SELECT login, file_name, timestamp FROM civil.personne; commit; end;
mais quand j’exécute:
Un message d'erreur s'affiche:Code:Execute copie_infos
Citation:
ORA-00001: violation de contrainte unique (INSTITUT.SYS_C0046903)
ORA-06512: à "INSTITUT.COPIE_INFOS", ligne 3
ORA-06512: à ligne 1
D'après ton message d'erreur on peut dire qu'il existe une contrainte nommée INSTITUT.SYS_C0046903 sur ta table institut.etudiant qui vérifie l'unicité d'un identifiant (technique ou fonctionnel).
Ce qui signifie que :
- Tu essayes d'ajouter dans ta table cible des lignes qui y existent déjà
- Ta table source contient des doublons sur cet identifiant
- Une opération de mise à jour (UPDATE ou MERGE) serait plus adaptée à ton besoin
Note : ces trois assertions ne sont pas exclusives.
Je ne sais pas pourquoi mais quand j'execute cette procedure:
les lignes s'ajoutent dans la table.Code:
1
2
3
4
5
6
7
8
9 create or replace procedure copie_infos is begin insert into exemple (id, file_name, date_appel) select identifiant, mail, naissance from civil.personne; where identifiant= '00025416'; commit; end; execute copie_infos
Mais quand j'execute cette procedure:
Ce message d'erreur s'afficheCode:
1
2
3
4
5
6
7
8 create or replace procedure copie_infos is begin insert into exemple (id, file_name, date_appel) select identifiant, mail, naissance from civil.personne; commit; end; execute copie_infos
ORA-00001: violation de contrainte unique (INSTITUT.EXEMPLE_PK)
ORA-06512: à "INSTITUT.COPIE_INFOS", ligne 3
ORA-06512: à ligne 1
Je ne peux pas remplir la table ligne par ligne quand même.
Avez vous des solutions a me proposer s'il vous plais
Détection des doublons dans la table source (en supposant que la PK de la table cible est sur le champ "id")
Si la requête donne un résultat il faut soit supprimer les doublons de le source soit supprimer la PK sur la table cible.Code:select identifiant,count(*) from civil.personne group by identifiant having count(*)>1;
Mais déjà est-ce que tu comprend la notion de doublons et de PK?
Si la requête ne retourne rien alors c'est que tu as déjà chargé des données, tu peux faire:
Attention la commande EXECUTE IMMEDIATE 'TRUNCATE TABLE exemple'; va supprimer tout le contenu de ta table exemple.Code:
1
2
3
4
5
6
7
8
9
10 CREATE OR REPLACE procedure copie_infos IS begin EXECUTE IMMEDIATE 'TRUNCATE TABLE exemple'; INSERT INTO exemple (id, file_name, date_appel) SELECT identifiant, mail, naissance FROM civil.personne; commit; end; execute copie_infos
Bon évidement je pars du principe que tu fait juste des tests de copie puisque tu vide ta table, si il y a un besoin fonctionnel derrière, il ne faut pas faire ça.