IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

passage de parametre dans un pl/sql


Sujet :

PL/SQL Oracle

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2009
    Messages : 152
    Points : 90
    Points
    90
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 947
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 947
    Points : 5 846
    Points
    5 846
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM UOAUP.AU_AUX_FT@LNK_INSTANCE WHERE rownum <10;
    Cette requête est fausse, il faut trier avant de filter avec rownum

  3. #3
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2009
    Messages : 152
    Points : 90
    Points
    90
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  4. #4
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2009
    Messages : 152
    Points : 90
    Points
    90
    Par défaut
    C'est bon, ca fonctionne maintenant.

    petit erreur de code de ma part...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 || '

  5. #5
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Juin 2009
    Messages : 152
    Points : 90
    Points
    90
    Par défaut
    Pour info,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type r_cursor is ref cursor;
        c_cursor1 r_cursor;
     
        cursor_rc AU_AUX_FT%ROWTYPE;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 16
    Dernier message: 17/06/2005, 15h44
  2. Réponses: 3
    Dernier message: 05/04/2005, 14h26
  3. Réponses: 6
    Dernier message: 24/12/2004, 16h46
  4. [langage] Passage de paramètres dans une fonction
    Par And_the_problem_is dans le forum Langage
    Réponses: 11
    Dernier message: 28/06/2004, 08h20
  5. Mettre a jour les Parametres dans une requete SQL
    Par Tartar Ukid dans le forum C++Builder
    Réponses: 7
    Dernier message: 31/03/2004, 13h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo