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 :

Update via un bloc dynamic avec cursor [12c]


Sujet :

PL/SQL Oracle

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Update via un bloc dynamic avec cursor
    Bonjour,
    contexte : package PL SQL avec procédure stockée
    Je dois traiter plusieurs tables source TS1, TS2, ...
    Pour chaque enregistrement source, il faut effectuer insert/update dans plusieurs tables de destination TD1, TD2, ...
    Tout ceci est paramétré dans la table de paramétrage laquelle je charge dans un VARRAY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      TYPE TCIB_TYP IS RECORD (
      TAB_BD varchar2(100),
      SELECT_ITF varchar2(4000), -- liste de colonne source
      CHAMPS_BD varchar2(4000), -- nom colonnes table TD
      CHAMPS_ITF varchar2(4000), -- 
      CHAMPS_SET varchar2(4000), -- clause 'SET' pour update
      CLAUSE_PK varchar2(4000) -- clause 'WHERE' pour update
      );
     tcib_tab TCIB_TAB_TYP;
    Après ce chargement, j'exécute du sql dynamique dans une procédure
    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
     
    ...
    DECLARE
    stmt vrchar2(4000);
    BEGIN
    ici un traitement en boucle par table source TS(n) initialise une collection varray avec les noms de tables à traiter, les clause where et les clauses set.
    Je voudrais ensuite effectuer pour chaque Table Source TS(n) dans un sql dynamique la lecture de ses enregistrements et la propagation vers les tables TD(m)
     
    stmt := '
    DECLARE
    m integer :=0;
    BEGIN
     for cursor c1 in (select .... from TS1) LOOP -- syntaxe 'logique'
       -- traitement de plusieurs table TD(m) cf. paramétrage
       for m in tcib_tab.FIRST...tcib_tab.LAST LOOP
         -- KO pour la ligne qui suit :
         UPDATE '||tcib_tab(m).TAB_BD|| ' SET '|| tcib_tab(m).CHAMPS_SET||' WHERE '||tcib_tab(m).CLAUSE_PK||';'
         -- 
       END LOOP
     END LOOP
    END;
    ';
    execute immediate stmt;
    END;
    Malheureusement , le tableau de paramétrage n'est pas reconnu lors de la compilation.
    Erreur de compilation : "Erreur(362,40): PLS-00201: l'identificateur 'M' doit être déclaré"

    D'avance merci de votre attention et de vos conseils.
    Comment passer les valeurs d'un VARRAY au sql dynamique ?
    Cdlt

  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
    Pourquoi tenter de créer tout un bloc anonyme à exécuter dynamiquement ?
    Je pense qu'il suffit de ne générer que les insert et update en sql dynamique, pour résoudre ce problème, sinon fournissez un jeu de données simplifié pour mieux cerner le problème.

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Comme Skuatamad : faire les boucles en pl, et les insert/update en dynamique.

    Juste pour donner quelques précisions sur l'erreur : Faire une boucle "for m IN tcib_tab..." dans la chaine de caractère à exécuter en dynamique, mais affecter les valeurs dans le bloc appelant, c'est incohérent
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'for m in tcib_tab.FIRST...tcib_tab.LAST LOOP UPDATE '||tcib_tab(m).TAB_BD
    Attention : La déclaration de "m integer" est inutile (et peut induire en erreur). La variable incrément d'une boucle FOR est locale à la boucle FOR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    DECLARE 
    m integer :=0; <- Inutile
    BEGIN
       for m in tcib_tab.FIRST...tcib_tab.LAST LOOP ...
    exemple
    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
    	m integer := 9;
    BEGIN
    	m := m + 1; DBMS_OUTPUT.put_line('Avant:'||m);
    	FOR m IN 1..2
      LOOP
      	DBMS_OUTPUT.put_line('Boucle:'|| m);
      END LOOP;
    	m := m + 1; 	DBMS_OUTPUT.put_line('Après:'||m);
    END;
     
    Avant:10
    Boucle:1
    Boucle:2
    Après:11
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Futur Membre du Club
    Femme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2017
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2017
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Bonjour,
    Merci à tous de votre interêt.
    Je m'explique : 'utilise le block dans sql dynamique pour déclarer le curseur cur1 dynamique.
    C'est un traitement générique : le nom de table source TS et la liste de colonnes dans le select du curseur sont variables.
    Pour McM :
    Il n'y a pas d'incohérence, mais c'est difficile à expliquer.
    Le tableau tabcib_tab contient le paramétrage du traitement à effectuer pour chaque ligne de table source et.
    Il est spécifique par tableau source.
    Quand je lit la table source (premier curseur), j'ai besoin de savoir dans quelle table (et quelles colonnes, clause where) reporter les informations lues.
    C'est pourquoi j'essaie de lire le tableau dans la boucle du curseur.

    Cdlt

  5. #5
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Il va falloir donner un exemple concret avec des données.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

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

Discussions similaires

  1. [AC-2003] Erreur avec UPDATE via les données d'une requete SELECT
    Par cpdump dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 11/06/2009, 12h32
  2. INSERT/UPDATE via DBLink
    Par Wilk dans le forum Oracle
    Réponses: 1
    Dernier message: 15/03/2006, 14h51
  3. syntaxe "UPDATE" (lecture d'une valeur avec jointu
    Par mrblue1978 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/01/2006, 14h38
  4. update d'après 2 tables avec ordre de date
    Par fred23195 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 22/12/2005, 17h39
  5. [Forms] Update d'un bloc basé
    Par zeuss dans le forum Forms
    Réponses: 14
    Dernier message: 02/02/2005, 12h18

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