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 :

Création d'un tableau de type OBJECT


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut Création d'un tableau de type OBJECT
    Bonjour,

    Pour éviter de trimbaler des dizaines de paramètres entre les différentes procédures des nombreux packages, j'ai regroupé les paramètres par thème fonctionnel en créant des "type record" au niveau de l'instance (par exemple, produit).
    Cela donne plus de cohérence au code en permettant de définir ce type de variable partout dans le code.

    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
    CREATE OR REPLACE TYPE rec_produit
    as object (
      CODE         NUMBER,
      DESCRIPTION  VARCHAR2(1000 BYTE),
      MONTANT      NUMBER,
      CONSTRUCTOR FUNCTION rec_produit RETURN SELF AS RESULT);
    /
     
    CREATE OR REPLACE TYPE BODY rec_produit
    AS
    CONSTRUCTOR FUNCTION rec_produit RETURN SELF AS RESULT
    IS
    BEGIN
        RETURN;
    END;
    END;
    /
    Cela marche bien.
    Je voudrais maintenant pouvoir définir de la même manière un tableau pour ce "record" pour pouvoir passer plusieurs produits d'un coup entre les diverses procédures.
    Je n'arrive pas à définir le tableau au niveau instance en créant un type.

    Merci de votre aide.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Peut-être comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TYPE t_rec_produit AS TABLE OF rec_produit;

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Ok merci.
    Mais je n'arrive pas à l'utiliser.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Procedure test is
      compteur number;
      myTable t_rec_produit := t_rec_produit();
     
    begin
      myTable(1).CODE := compteur;
      myTable(1).DESCRIPTION := 'Description N.' || compteur;
      myTable(1).MONTANT := compteur*100;
    end;
    ORA-06533: Valeur de l'indice trop grande

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il y a d'autres méthodes, mais celle-ci fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE
      compteur number := 1;
      myTable t_rec_produit;
    begin
      myTable := t_rec_produit( rec_produit(compteur, 'Description N.' || to_char(compteur), compteur*100)  );
    END;
    /

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Oui ca marche. Merci.

    Mais je voudrais que "myTable" puisse contenir de 1 à n records "rec_produits"
    pour passer le contenu de "myTable" en paramètre de procédures.

  6. #6
    Membre éclairé
    Inscrit en
    Septembre 2004
    Messages
    378
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 378
    Par défaut
    Voilà.
    J'ai réussi à faire ce que je voulais.

    Pouvez-vous me dire si c'est bien ?
    Y a-t-il besoin de toutes les fonctions CONSTRUCTOR pour rec_produit ?

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    CREATE OR REPLACE TYPE rec_produit AS OBJECT (
      CODE         NUMBER,
      DESCRIPTION  VARCHAR2(1000 BYTE),
      MONTANT      NUMBER,
      CONSTRUCTOR FUNCTION rec_produit RETURN SELF AS RESULT,
      CONSTRUCTOR FUNCTION rec_produit(pCODE IN NUMBER) RETURN SELF AS RESULT,
      CONSTRUCTOR FUNCTION rec_produit(pDESCRIPTION IN VARCHAR2) RETURN SELF AS RESULT,
      CONSTRUCTOR FUNCTION rec_produit(pMONTANT IN NUMBER) RETURN SELF AS RESULT);
    /
     
    CREATE OR REPLACE TYPE BODY rec_produit
    AS
    CONSTRUCTOR FUNCTION rec_produit RETURN SELF AS RESULT
    IS
    BEGIN
        RETURN;
    END;
     
    CONSTRUCTOR FUNCTION rec_produit(pCODE IN NUMBER) RETURN SELF AS RESULT
    IS
    BEGIN
       self.code := pcode;
       RETURN;
    END;
     
    CONSTRUCTOR FUNCTION rec_produit(pDESCRIPTION IN VARCHAR2) RETURN SELF AS RESULT
    IS
    BEGIN
       self.DESCRIPTION := pDESCRIPTION;
       RETURN;
    END;
     
    CONSTRUCTOR FUNCTION rec_produit(pMONTANT IN NUMBER) RETURN SELF AS RESULT
    IS
      BEGIN
         self.MONTANT := pMONTANT;
         RETURN;
     END;
    END;
    /
     
    CREATE OR REPLACE TYPE tab_produit AS vARRAY (100) OF  REC_produit
    /
     
    CREATE OR REPLACE PACKAGE PKG_test
    AS
    procedure test;
    END PKG_test;
    /
     
    CREATE OR REPLACE PACKAGE BODY PKG_test AS
     
    PROCEDURE insertion ( mesDonnes in tab_produit ) IS
     
    compteur NUMBER;
     
    BEGIN
        FOR compteur IN mesDonnes.first..mesDonnes.LAST
    	LOOP
    	    INSERT INTO toto VALUES (mesDonnes(compteur).code,mesDonnes(compteur).description,mesDonnes(compteur).montant);
    	END LOOP;
    	COMMIT;
     
    END insertion;
     
    PROCEDURE test IS
       compteur NUMBER := 1;
       myTable   tab_produit ;
    BEGIN
       myTable   :=  tab_produit();
     
       FOR compteur in 1..10
       LOOP
           myTable.extEND;
    	   myTable(compteur) :=  rec_produit(null,null,null);
           myTable(compteur).CODE := compteur;
           myTable(compteur).DESCRIPTION := 'Description N.' || compteur;
           myTable(compteur).MONTANT := compteur*100;
     
        --insert into produit values (myTable(compteur).CODE,myTable(compteur).DESCRIPTION,myTable(compteur).MONTANT);
       END LOOP;
       insertion(myTable);
     
    END TEST;
     
    END PKG_test;
    /

Discussions similaires

  1. [PHP 5.0] Lire un tableau de type stdClass Object
    Par poupy dans le forum Langage
    Réponses: 8
    Dernier message: 28/09/2012, 13h27
  2. Création d'un attribut de type tableau en base
    Par Toph1 dans le forum W4 Express
    Réponses: 0
    Dernier message: 06/02/2009, 15h41
  3. Création d'un tableau composé de TComboBox
    Par gilles641 dans le forum Langage
    Réponses: 1
    Dernier message: 26/07/2005, 10h30
  4. [Debutant]reallocation de memoire d'un tableau de type perso
    Par killerjeff dans le forum Débuter
    Réponses: 3
    Dernier message: 04/08/2004, 17h09
  5. [Debutant][Collection] Création d'un vecteur de type d'une classe
    Par Tao® dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 22/04/2004, 17h06

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