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 :

Remplissage Table de façon dynamique


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut Remplissage Table de façon dynamique
    Bonjour, j'ai une nested table créée à partir d'un record. J'aimerai initialisé cette table avec des records à NULL, le seul problème c'est que je ne sais pas combien de records j'aurai à ajouter dans cette table, d'où j'aimerai l'initialiser dynamiquement.

    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
     
      v_ret filmsCatalogue;
     
      newFilms filmsRecord := filmsRecord(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
     
      TYPE ACTORS IS TABLE OF PERSONNE%ROWTYPE INDEX BY BINARY_INTEGER;
      actorOfFilm ACTORS;
     
      TYPE PRODS IS TABLE OF A_PRODUIT%ROWTYPE INDEX BY BINARY_INTEGER;
      production PRODS;
     
      TYPE GENRES IS TABLE OF GENRE%ROWTYPE INDEX BY BINARY_INTEGER;
      gen GENRES;
     
      counter INTEGER;
     
     
      actor VARCHAR(2000);
      mpaa VARCHAR(30);
      director VARCHAR(30);
      prod VARCHAR(100);
      quality VARCHAR(30);
      genr VARCHAR(2000);
     
     
      TYPE EmpCurTyp IS REF CURSOR;  -- define weak REF CURSOR type
       curseFilm   EmpCurTyp;
     
      lgFilm  Film%ROWTYPE;
     
       numFilm INTEGER;
       p_id    INTEGER;
    	begin
        numFilm := 1;
        IF p_id_film.count = 3
        THEN v_ret := filmsCatalogue(newFilms,newFilms,newFilms);
        ELSE 
          IF p_id_film.count = 5
          THEN v_ret := filmsCatalogue(newFilms,newFilms,newFilms,newFilms,newFilms);
          ELSE
               v_ret := filmsCatalogue(newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms);
          END IF;
        END IF;

    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
    Par défaut
    Je ne sait pas si je tout compris, mais:
    La nested table tu l'initialisé sans elements
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ma_nt Nested_table := nested_table();
    Ensuite tu utilise Extend pour ajouter les N elements vides
    Que tu valorise peut être dans une boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      For i In 3..7 Loop
         ma_nt.id(i) := i;

  3. #3
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Merci de votre attention.

    J'ai fait ce que vous m'avez dis mais ca ne marche toujour pas j'ai comme erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-06530: Référence à un élément composite non initialisé de
    je vous recolle le code que j'ai

    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
     
    function getFilms(p_id_FILM in curseRetTab) return filmsCatalogue is
     
      v_ret filmsCatalogue;
     
      newFilms filmsRecord := filmsRecord(NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL);
     
      TYPE ACTORS IS TABLE OF PERSONNE%ROWTYPE INDEX BY BINARY_INTEGER;
      actorOfFilm ACTORS;
     
      TYPE PRODS IS TABLE OF A_PRODUIT%ROWTYPE INDEX BY BINARY_INTEGER;
      production PRODS;
     
      TYPE GENRES IS TABLE OF GENRE%ROWTYPE INDEX BY BINARY_INTEGER;
      gen GENRES;
     
      counter INTEGER;
     
     
      actor VARCHAR(2000);
      mpaa VARCHAR(30);
      director VARCHAR(30);
      prod VARCHAR(100);
      quality VARCHAR(30);
      genr VARCHAR(2000);
     
     
      TYPE EmpCurTyp IS REF CURSOR;  -- define weak REF CURSOR type
       curseFilm   EmpCurTyp;
     
      lgFilm  Film%ROWTYPE;
     
       numFilm INTEGER;
       p_id    INTEGER;
    	begin
        numFilm := 1;
     
        /*IF p_id_film.count = 3
        THEN v_ret := filmsCatalogue(newFilms,newFilms,newFilms);
        ELSE 
          IF p_id_film.count = 5
          THEN v_ret := filmsCatalogue(newFilms,newFilms,newFilms,newFilms,newFilms);
          ELSE
               v_ret := filmsCatalogue(newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms,newFilms);
          END IF;
        END IF;*/
        v_ret := filmsCatalogue();
     
     
            while numFilm <= p_id_film.count
              LOOP
                p_id := p_id_film(numFilm).id_film;
                OPEN curseFilm FOR 'SELECT * FROM FILM WHERE ID_FILM = :s' USING p_id;
                FETCH curseFilm INTO lgFilm;
                CLOSE curseFilm;
     
                //[...]   code pour créer mes chaines
     
                 v_ret.EXTEND ;
                 v_ret(numFilm).id_film := lgFilm.id_film;
     
                 v_ret(numFilm).Nom := lgFilm.Nom;
                 v_ret(numFilm).Date_de_sortie := lgFilm.Date_de_sortie;
                 v_ret(numFilm).duree := lgFilm.duree;
                 v_ret(numFilm).couleur := lgFilm.couleur;
                 v_ret(numFilm).affiche := lgFilm.affiche;
                 v_ret(numFilm).mpaa := mpaa;
                 v_ret(numFilm).genre := genr;
                 v_ret(numFilm).acteur := actor;
                 v_ret(numFilm).producteur := director;
                 v_ret(numFilm).maisonproduction := prod;
                 v_ret(numFilm).qualite := quality;
     
                 numFilm := numFilm +1;
     
              END LOOP;
     
     
    		return v_ret;
    	end getFilms;
    et voila mes objets

    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
     
    create or replace TYPE filmsRecord is object (
         ID_Film numeric(4),
         Nom varchar(100),
         Date_de_sortie date,
         Duree numeric(3),
         Couleur varchar(30),
         Affiche blob ,
         MPAA varchar(30),
         Genre varchar(500),
         Acteur varchar(2000),
         Producteur varchar(100),
         MaisonProduction varchar(100),
         Qualite varchar(30)
     );
     /
    create or replace type filmsCatalogue is table of filmsRecord;
    /

  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
    Désolé, mais je ne vais pas debugger le code pour vous. Commencez d’abord par supprimer toutes les déclarations des types et variables non utilisés. Ensuite le constructeur par défaut d’un objet initialise l’objet avec des nuls pour les attributs ; il suffit d’écrire nom_objet(). Consultez aussi le tutoriel PL/SQL sur les collections.

  5. #5
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2008
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2008
    Messages : 126
    Par défaut
    Bonjour, j'ai lu sur diverses sources que l'on devait initialiser un type objet. Or, ici j'ai une nested table de d'un type objet et non d'une table existante. J'aimerais donc savoir comment faire pour initialiser mon type objet lors de l'initialisation de ma table.

    Car lorsque je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    ma_table := mon_type_table();
     
    ma_table.EXTEND;
    ma_table(1).mon_champs := 'quelque chose';
    J'ai une erreur de type:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-06530: Référence à un élément composite non initialisé
    merci d'avance

    Julien

  6. #6
    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
    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
     
    create or replace type scalar_dept As Object (
      deptno  Number(2),
      dname   varchar2(14),
      loc     varchar2(13)
    )
    /
    create or replace type dept_nt Is Table Of scalar_dept
    /
     
    Declare
      l_dept  scalar_dept; 
      l_ntab  dept_nt     := dept_nt(); 
    Begin
      l_dept := scalar_dept(10, 'DEPT1','TEST');
      l_ntab.Extend(2);
      l_ntab(1) := l_dept;
      l_ntab(2) := scalar_dept(20, 'DEPT2','TEST');
      --
      For i in 1..l_ntab.Count() Loop
        dbms_output.put_line(l_ntab(i).deptno);
        dbms_output.put_line(l_ntab(i).dname);
      End Loop;
    End;
    Par contre cette affirmation est complètement fausse.
    Ensuite le constructeur par défaut d’un objet initialise l’objet avec des nuls pour les attributs ; il suffit d’écrire nom_objet().
    [Edit]
    Ajouté les définitions des types
    [/Edit]

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

Discussions similaires

  1. [2012] Copier des tables entre serveurs de façon dynamique
    Par SQL_EVAN dans le forum SSIS
    Réponses: 16
    Dernier message: 16/09/2013, 14h02
  2. listbox ajustement de la taille de façon dynamique
    Par ana2sb dans le forum Access
    Réponses: 3
    Dernier message: 14/10/2005, 17h11
  3. Nommer un objet de façon dynamique
    Par jflebegue dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 02/09/2005, 14h01
  4. Remplissage table avec les jours d'un mois
    Par tomtom25 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/05/2005, 14h32
  5. [syntaxe]Creation table avec nom dynamique
    Par ZuZu dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/09/2004, 18h01

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