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 :

collection & update complexe


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut collection & update complexe
    Bonjour,
    j'ai des updates (multiples) a faire sur une table, et je me sers d'une table (Record) pour stocker temporairement mes updates avant de faire un forall (il s'agit de centaines de milliers de lignes a updater)

    je ne trouve pas de solution pour éviter l'erreur PLS-00436, sachant que mon update est un peu complexes, il s'agit de 49 champs à mettre à jour. Il y a aussi le fait que la requête de la loop qui sert a parcourir en premier lieu n'a pas la même structure (la collection listeClientRow )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    TYPE clientRow IS TABLE OF CLIENT_O%ROWTYPE;
    listeClientRow clientRow;
     
    TYPE clientUpd IS RECORD (champ1, .....);
    TYPE clientUpdRow IS TABLE OF clientUpd;
    listeUpdClientRow clientUpdRow;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    reqUpdat:='UPDATE CLIENTS  ';
    reqUpdat:=reqUpdat || 'SET ';
    reqUpdat:=reqUpdat || 'champ1=:1, champ2 =: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
    16
    17
    18
    19
    20
    21
    22
     
    LOOP
          FETCH clientCur BULK COLLECT INTO listeClientRow LIMIT NBMAXCOMMIT;
          EXIT WHEN listeClientRow.count=0;
          listeUpdClientRow := clientUpdRow();
          FOR i in listeClientRow.first.. listeClientRow.last
             LOOP
     
              IF ******
              nbUpdat:=nbUpdat + 1;
              listeUpdClientRow.extend(1);
              listeUpdClientRow(nbUpdat).champ1:= listeClientRow(i).champ1  ;
              listeUpdClientRow(nbUpdat).champ2 := listeClientRow(i).champ2  ;
              ....
              END IF;
     
    END LOOP;
     
    forall i in listeUpdClientRow.first..listeUpdClientRow.last
    ***reqUpdat---using listeUpdClientRow(i).champ1, ....
     
    END LOOP;
    Merci d'avance

  2. #2
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 62
    Par défaut
    OK,
    j'avais déjà vu ce tuto avant de poster ici.
    le probleme est que mon select se fait pas sur les mêmes champs, je fais un select col1, col2, col3,.... pour la boucle du collect
    mais je fais des traitements et des calculs pour faire des update
    update table set (col1, col5, col6) = (newval1, newval2...)

    donc je ne peux pas utiliser le meme objet que le select comme dans l'exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TYPE emp_ot AS OBJECT
    SELECT emp_ot(empno, ename, sal)
     
    UPDATE emp
    SET    ename = TREAT(nt_emp(i) AS emp_ot).ename
    une deuxieme question, comment integrer le crate type as object dans uen procedure stockée?!

    Merci

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Citation Envoyé par jdar Voir le message
    ...

    donc je ne peux pas utiliser le meme objet que le select comme dans l'exemple:
    Nul besoin d’utiliser le même objet que le select ; ce qu’importe c’est d’utiliser un objet (bref le bon objet) que t’initialise et modifié comme t’as besoin.

    une deuxieme question, comment integrer le crate type as object dans uen procedure stockée?!

    Merci
    Les types sont à créer en SQL et non pas en PL/SQL dans ce cas.

Discussions similaires

  1. Save or Update sur une collection
    Par *alexandre* dans le forum Hibernate
    Réponses: 2
    Dernier message: 04/01/2009, 14h29
  2. Requête Update complexe
    Par Sandara dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/09/2008, 14h38
  3. Réponses: 3
    Dernier message: 27/10/2007, 11h33
  4. Pb update dataset "requete trop complexe"
    Par timotep dans le forum VB.NET
    Réponses: 3
    Dernier message: 24/08/2007, 09h47
  5. [oracle 9i]update à partir d'une selection complexe
    Par Requin15 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/06/2006, 10h18

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