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)
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 ?
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 ?
En fait j'ai essayé quelques codes. Entre autre:
Mais cela ne marche pas parce qu'il s'agit de deux tables differentes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 marche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 INSERT INTO exemple (id, file_name, date_appel) SELECT identifiant, mail, naissance FROM premier;
[On part de loin là ]
shift-F9 ==> Va simplement compiler votre procédure
Une fois compilée : Lancer la commande
Code : Sélectionner tout - Visualiser dans une fenêtre à part Execute copie_infos
Grâce à vous tous, je sens que je suis sur la bonne voie.
J'ai tapé ce code:
Puis:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 bien
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part Execute copie_infos
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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'affiche
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager