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

Oracle Discussion :

[9.2 PL/SQL] bulk collect dans une collection d'objets


Sujet :

Oracle

  1. #1
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut [9.2 PL/SQL] bulk collect dans une collection d'objets
    Bonjour,
    ça fais des heures que je tourne en rond et je suis sûr que je pass à côté d'un bête détail !

    j'ai un type enregistré dans la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    create or replace 
            Type CheckType is Object (
                                        Doc_number  Varchar2(30)
                                        , Amount    Number
                                     )
    j'ai ensuite une PL dans laquelle je voudrais faire un bulk collect avec ce type :
    (code partiel)
    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
    ...
        Cursor cPROD06 ( pv_SBi Varchar2 ) is
            Select
                    ACT.Doc_number 
                    , ACT.Doc_Total_Amount_DC
            From    Act_Document@PCS06p     ACT
            Where   substr(doc_number,0,6) = pv_SBi 
            Order by Doc_Number ;
     
            Type CheckTab is table of CheckType ;
     
            tPROD                   CheckTab ;
     
    Begin
        ...
            Open cPROD06(i.SupportBudget_i) ;
            Fetch cPROD06 bulk collect into tPROD ;
            Close cPROD06 ;
        ...
    End ;
    et cette opération échoue avec un PLS-00386: non-concordance de type à 'TPROD' entre curseur FETCH et variables INTO...

    que fais-je donc de faux ?
    je passe sûrement à côté d'une évidence, mais je commence à voir double !
    toute aide est la bienvenue.

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Cela ne fonctionne pas avec les objets. Il faut utiliser un type Record

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    DECLARE
     TYPE typ_rec IS RECORD (empno NUMBER(4), ename VARCHAR2(10));
     TYPE tab_typ_rec IS TABLE OF typ_rec ;
     CURSOR cur IS SELECT empno, ename FROM EMP ;
     ttab tab_typ_rec;
    BEGIN
     OPEN cur ;
     FETCH cur BULK COLLECT INTO ttab ;
     CLOSE cur ;
    END;

  3. #3
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Diantre !
    c'est embêtant parceque je voulais ensuite utiliser cette collection dans un Select
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
            Select 
                    Count(*)       
            Into    nDifCount
            From    Table(tPROD) P
            Where   ( P.Doc_Number, P.Amount) not in (...
    et ça ce n'est pas possible si j'utilise un type Record.. je me retrouve avec cette erreur :
    PLS-00642: types de collecte locale interdite dans les instructions SQL
    une suggestion pour contourner cette limitation ?

  4. #4
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Comme ça, j'ai pas de réponse, sinon d'alimenter la table d'objets avec la table d'enregistrements...
    (oui, je sais, c'est sale....)

    ou laissez tomber le BULK COLLECT .........

  5. #5
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Citation Envoyé par SheikYerbouti
    ou laissez tomber le BULK COLLECT .........
    hummm...
    et comment est-ce que je peux alimenter la collection d'objet sans passer par le bulk collect (au niveau syntaxe) ?

    Je suppose qu'il faut faire un Loop dans les rows du curseur, mais quelle est la syntaxe d'insertion d'objets dans la collection ? je n'arrive pas à me rappeler.

    merci d'avance de me rappeler mes fondamentaux !

  6. #6
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Les fondamentaux sont dans les tutos
    http://sheikyerbouti.developpez.com/...?page=Chap5#L5

  7. #7
    Membre éprouvé Avatar de Yorglaa
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    845
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2004
    Messages : 845
    Points : 931
    Points
    931
    Par défaut
    Merci beaucoup pour les info !
    alors au final, voici la solution que j'ai adopté (il y a peut-être mieux / plus simple à faire ?). Je la met ici si d'autre sont intéressés...

    les types (en base) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace 
            Type CheckType is Object ( 
                                        Doc_number  Varchar2(30) 
                                        , Amount    Number 
                                     ) ;
     
    create or replace
            Type CheckTab is table of CheckType ;
    la déclaration des variables y relatives dans le code (l'objet sera initialisé plus loin) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            oCheckObject            CheckType ;
            tPROD                   CheckTab := CheckTab( Null ) ; 
            tLOCAL                  CheckTab := CheckTab( Null ) ;
            nIDX                    pls_integer ;
    et enfin l'utilisation (y.c. l'initialisation de l'objet) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            nIDX := 0 ;
     
            oCheckObject := CheckType( Null, Null) ; 
     
            For ii in cPROD06(i.SupportBudget_i)
            Loop
                oCheckObject.Doc_Number := ii.Doc_Number ;
                oCheckObject.Amount := ii.Doc_Total_Amount_DC ;
                tPROD.Extend ;
                tPROD(nIDX + 1) := (oCheckObject) ;
            End Loop ;
    Voilà... pour moi ça fonctionne !

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

Discussions similaires

  1. [2.x] Une collection dans une collection ?
    Par Crackerz dans le forum Symfony
    Réponses: 2
    Dernier message: 25/08/2014, 21h22
  2. comment effacer un element dans un collection dans une boucle for each
    Par medkarim dans le forum VB 6 et antérieur
    Réponses: 6
    Dernier message: 17/10/2008, 12h48
  3. enregistrer une collection dans une table
    Par Msysteme dans le forum Struts 1
    Réponses: 4
    Dernier message: 03/10/2008, 13h22
  4. Mapper une collection dans une classe personnalisée
    Par Baptiste Wicht dans le forum JPA
    Réponses: 3
    Dernier message: 18/05/2008, 12h04
  5. problème d'une collection dans une form
    Par root76 dans le forum Struts 1
    Réponses: 12
    Dernier message: 19/04/2007, 16h22

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