Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 06/12/2010, 18h33   #1
Membre du Club
 
Inscription : juin 2009
Messages : 147
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 147
Points : 57
Points : 57
Par défaut passage de parametre dans un pl/sql

Bonjour,

Je souhaiterais placer en paramètre le nom de ma table dans une procédure afin de lancer un insert into table par la suite:

Le problème c'est que je n'arrive pas à utiliser le paramètre, cela me donne 'table not exist'...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
table_name varchar(20) := 'AU_AUX_FT_R';
 
CURSOR SRC_AU_AUX_FT IS SELECT * FROM UOAUP.AU_AUX_FT@LNK_INSTANCE WHERE rownum <10;
SRC_AU_AUX_FT_rc SRC_AU_AUX_FT%ROWTYPE; 
 
 
BEGIN
    dbms_output.put_line('insertion dans la table ' || table_name);
    OPEN SRC_AU_AUX_FT;
    LOOP
        FETCH SRC_AU_AUX_FT INTO SRC_AU_AUX_FT_rc;
        EXIT WHEN SRC_AU_AUX_FT%NOTFOUND;
        INSERT INTO table_name
        (
            EXE_IDT_NUM, 
            EXC_EXC_NAT, 
            PFS_PRA_SPE,
            ......
Savez vous pourquoi je n'arrive pas a utiliser le parametre ...
Merci
breizh76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 18h49   #2
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 929
Points : 1 929
Il faut utiliser EXECUTE IMMEDIATE

Par contre je ne vois pas bien comment tu vas gérer les values à insérer, les tables n'ayant à priori pas le même nombre/type de colonne.
Donc je ne suis pas convaincu de l'utilité du sql dynamique.
Code :
SELECT * FROM UOAUP.AU_AUX_FT@LNK_INSTANCE WHERE rownum <10;
Cette requête est fausse, il faut trier avant de filter avec rownum
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 09h21   #3
Membre du Club
 
Inscription : juin 2009
Messages : 147
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 147
Points : 57
Points : 57
J'utilise le rownum seulement pour limiter le nombre de ligne.

de plus, je ne fais que copier la table (insert into select) table_source=table_dest.

Je viens de faire le test de l'execute immédiate et j'ai le même problème:

table ou view not exist...

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
   table_name varchar(20) := 'AU_AUX_FT_R';
    Requete  VARCHAR2(2048) ;
 
    CURSOR SRC_AU_AUX_FT IS SELECT * FROM UOAUP.AU_AUX_FT@LNK_instance.WORLD WHERE rownum <10;
    SRC_AU_AUX_FT_rc SRC_AU_AUX_FT%ROWTYPE; 
 
 
BEGIN
    dbms_output.put_line('insertion dans la table ' || table_name);
    OPEN SRC_AU_AUX_FT;
    LOOP
        FETCH SRC_AU_AUX_FT INTO SRC_AU_AUX_FT_rc;
        EXIT WHEN SRC_AU_AUX_FT%NOTFOUND;
        Requete := 'INSERT INTO table_name
        (
            EXE_IDT_NUM
        )
        VALUES
        (
            SRC_AU_AUX_FT_rc.EXE_IDT_NUM
        )';
    EXECUTE IMMEDIATE Requete;
    END LOOP;
 
    COMMIT;
breizh76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 11h28   #4
Membre du Club
 
Inscription : juin 2009
Messages : 147
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 147
Points : 57
Points : 57
C'est bon, ca fonctionne maintenant.

petit erreur de code de ma part...

Code :
1
2
3
4
5
 
LOOP
        FETCH SRC_AU_AUX_FT INTO SRC_AU_AUX_FT_rc;
        EXIT WHEN SRC_AU_AUX_FT%NOTFOUND;
        REQUETE := 'INSERT INTO UOAUP.' || table_name || '
breizh76 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/12/2010, 16h49   #5
Membre du Club
 
Inscription : juin 2009
Messages : 147
Détails du profil
Informations personnelles :
Âge : 31

Informations forums :
Inscription : juin 2009
Messages : 147
Points : 57
Points : 57
Pour info,

Solution définitive, Utiliser un curseur dynamique ...

Code :
1
2
3
4
5
 
type r_cursor IS ref cursor;
    c_cursor1 r_cursor;
 
    cursor_rc AU_AUX_FT%ROWTYPE;
Code :
1
2
3
4
5
6
 
open c_cursor1 FOR vc2_select;
    LOOP
        FETCH c_cursor1 INTO cursor_rc;
        EXIT WHEN c_cursor1%NOTFOUND;
        dbms_output.put_line(cursor_rc.EXE_IDT_NUM);
breizh76 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 16h11.


 
 
 
 
Partenaires

Hébergement Web