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

SQL Oracle Discussion :

Pb avec Execute IMMEDIATE et bloc dynamique


Sujet :

SQL Oracle

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut Pb avec Execute IMMEDIATE et bloc dynamique
    Bonjour à tous,

    Je me retrouve depuis plusieurs longues et interminables heures devant un problème que je ne sais résoudre.

    J'ai créé une procédure stockée dans l'un de mes packages et je voudrais suivant l'enregistrement dans ma table appeler dynamiquement la procédure stockée associée.

    Pour cela, je crée le morceau de code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ps_query := 'BEGIN :1 := ' || rec_regle.contenu_regle || '(:2 , :3 , :4, :5, :6, :7, :8, :9, cp_tCritere, 1); END;';
     
    EXECUTE IMMEDIATE ps_query USING OUT num_ligne,rec_regle.id_sous_regle, rec_regle.balise_xml_deb, rec_regle.balise_xml_fin, pv_flux_xml_csv, num_ligne, pv_user_id, pv_task_id, pv_id_modele;
    Le problème que je rencontre c'est au sujet de cp_tCritere qui est un tableau d'enregistrements qui crée une erreur lors du Execute Immediate en renvoyant une erreur de type : 'l'identificateur 'CP_TCRITERE' doit être déclaré' alors que ce dernier est déclaré correctement dans la procédure qui contient notamment l'appel dynamique ci dessus.

    Je rajouterai que j'ai essayé de le passer dans le USING (comme pr tous les autres parametres) mais cela me renvoie une erreur du type 'instruction SQL' non valide.

    Comment se fait il qu'il ne soit pas reconnu à l'interieur du bloc dynamique que je souhaite executer ?

    Quelle solution proposeriez vous ?

    merci d'avance...

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut


    l'execute immediate ne voit pas tes variables externes. c'est un block autonome.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    DECLARE
    	TYPE TAB_V IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;   
        varr TAB_V;
     BEGIN
     	varr(1) := 1;
        varr(2) := 2;
     	FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE(varr(i)); END LOOP;
     END;
     
    1
    2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    BEGIN      
    EXECUTE IMMEDIATE 'DECLARE
    	TYPE TAB_V IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;   
        varr TAB_V;
     BEGIN
     	varr(1) := 1;
        varr(2) := 2;
     	FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE(varr(i)); END LOOP;
     END;';
     END;
     
     1
     2
    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
     DECLARE
     TYPE TAB_V IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;   
        varr TAB_V;
     BEGIN      
    EXECUTE IMMEDIATE 'BEGIN
     	varr(1) := 1;
        varr(2) := 2;
     	FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE(varr(i)); END LOOP;
     END;';
     END;
     ORA-06550: line 2, COLUMN 3:
    PLS-00201: IDENTIFIER 'VARR' must be declared
    ORA-06550: line 2, COLUMN 3:
    PL/SQL: STATEMENT ignored
    ORA-06550: line 3, COLUMN 5:

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut oui mais...
    Je te remercie pr la rapidité de ta réponse et concernant ce que tu as écrit je suis a 100% d'accord avec toi. Seulement, si je déclare mon tableau a l'interieur de mon bloc autonome je n'aurai plus le contenu de mon tableau jusque la rempli par les lignes précédant ce Exexcute Immediate, dans ma procédure.
    L'idéal alors serait de le sortir du bloc autonome et utiliser le USING comme pr les autres variables ci dessus afin qu'il soit reconnu.

    Seulement le USING apparemment ne reconnait pas mon tableau en tant que tableau justement... Et me renvoie une erreur 'Instruction sql non valide'...

    je suis donc tjs bloqué !

  4. #4
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Ok, si tu veux récupérer les données de ce tableau :
    Crée le type en base (dans les spec d'un package).

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE PACKAGE STO_PKG_AFFECT_STOCK
    AS
    	TYPE REC_STOCK IS RECORD(DATE_CDE DATE, QTE NUMBER);
    	TYPE TAB_STOCK IS TABLE OF REC_STOCK INDEX BY BINARY_INTEGER;   
    	T_STOCK TAB_STOCK;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     BEGIN      
    	sto_pkg_affect_stock.T_STOCK.DELETE;
    EXECUTE IMMEDIATE 'BEGIN
     	sto_pkg_affect_stock.T_STOCK(1).qte := 5;
     	sto_pkg_affect_stock.T_STOCK(2).qte := 50;
        FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE(''inside:''||sto_pkg_affect_stock.T_STOCK(i).qte); END LOOP;
     END;';
         FOR i IN 1..2 LOOP DBMS_OUTPUT.PUT_LINE('Outside:'||sto_pkg_affect_stock.T_STOCK(i).qte); END LOOP;
     END;
    Vu que la variable de package est par session, tu peux y accéder dans l'execute, comme hors de l'execute. Par contre, faut penser à l'effacer

    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    inside:5
    inside:50
    Outside:5
    Outside:50

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut
    C'est l'idée sur laquelle je venais de penser justement...
    Je vais déjà faire un essai avec ce que j'ai en tête et voir ce que ca donne...

    En tous les cas merci bcp pr ta réactivité ! Et bravo pr comprendre aussi rapidement les problématiques !

    Signé un tit débutant qui respecte l'expert !

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Par défaut
    A première vue, ca a l'air de fonctionner !!! je fais faire une rafale de tests en esperant que tout cela tienne le choc !


    Encore merci pour les conseils ! C d'ailleurs ainsi qu'il fallait procéder !

    Ouaouane

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

Discussions similaires

  1. [sql dynamique] Erreur avec EXECUTE IMMEDIATE
    Par Foublanc1 dans le forum SQL
    Réponses: 0
    Dernier message: 06/05/2013, 14h46
  2. Problème avec execute immediate
    Par jojo280 dans le forum SQL
    Réponses: 7
    Dernier message: 05/07/2008, 18h25
  3. Select dynamique avec execute immediate
    Par BOLARD dans le forum SQL
    Réponses: 7
    Dernier message: 03/06/2008, 16h41
  4. [oracle 8.1.7] pbm de privilège avec execute immediate
    Par Nounoursonne dans le forum Oracle
    Réponses: 4
    Dernier message: 10/02/2006, 16h45
  5. Réponses: 2
    Dernier message: 05/01/2006, 10h43

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