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 :

Type TABLE EXTEND


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut Type TABLE EXTEND
    Bonjour,

    Je cherche à retourner une liste en IN OUT à partir d'une fonction.

    Je voudrais pouvoir ajouter des éléments dans la liste en utilisant la fonction extend mais avant cela vérifier si l'élément à ajouter existe déjà dans une autre table.

    J'ai essayé de faire ceci :

    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
    DECLARE
     
    	TYPE REC IS RECORD(
    		CODE_REMISE VARCHAR2(10),
    		CODE_POURCENTAGE NUMBER
        );
     
    	TYPE TAB IS TABLE OF REC
    		INDEX BY BINARY_INTEGER;
     
    	VTAB TAB;
     
    	CURSOR C1 IS
    		SELECT CODE_REMISE, CODE_POURCENTAGE
    		FROM TABLE_REMISE
    		WHERE NUM = '1DOLL123';
     
    	V_CODE_REMISE VARCHAR2(10);
     
    BEGIN
     
      OPEN C1;
      FETCH C1 BULK COLLECT INTO VTAB;
     
      IF VTAB.COUNT > 0 THEN
    	FOR I IN 1..VTAB.COUNT
    	LOOP
     
    	SELECT C_REMISE
    	INTO V_CODE_REMISE
    	FROM TABLE_REMISE_TMP
    	WHERE C_REMISE = VTAB(I).CODE_REMISE;
     
    	IF V_CODE_REMISE IS NOT NULL OR V_CODE_REMISE <> '' THEN
    	VTAB.EXTEND(....);
        ...
    	...
     
    END;
    mais je ne sais si ce que j'ai fait jusqu'à présent est correct et je ne vois pas comment utiliser la fonction extend dans mon code.

    Merci,

  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
    Lisez un peu la doc PL/SQL Collections and Records avant de vous lancer dans la programmation cela permet d'avancer beaucoup plus vite.

    EXTEND is a procedure that adds elements to the end of a varray or nested table.
    Veut dire que la méthode ne s'applique pas aux collections de type vecteur index by

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut
    Bonjour mnitu,

    J'ai parvenu à faire ceci :

    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
    DECLARE
    	TYPE TYPE_LISTE IS TABLE OF MA_TABLE.MON_CHAMPS%TYPE;
     
    	MA_LISTE TYPE_LISTE := TYPE_LISTE();
     
    	CURSOR C IS
    		SELECT T1.MON_CHAMPS
    		FROM MA_TABLE1 T1
    		WHERE EXISTS (SELECT T2.MON_CHAMPS FROM MA_TABLE2 T2 WHERE T2.MON_CHAMPS = T1.MON_CHAMPS);
     
    BEGIN  
        BEGIN
          FOR R IN C
          LOOP
            MA_LISTE.EXTEND;
            MA_LISTE(MA_LISTE.COUNT) := R.MON_CHAMPS;
          END LOOP;
        END;
    END;
    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
    Pourquoi il a BEGIN suivi de BEGIN ?
    Pourquoi charger via extend quand le bulk fetch permet de faire la même chose directement ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2017
    Messages
    176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2017
    Messages : 176
    Par défaut
    Merci pour votre réponse.

    Pour le second begin c'est parce que je voulais ajouter une exception.

  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
     
    Declare
      Type TYPE_LISTE Is Table OF EMP.ENAME%Type; 
      ma_liste        TYPE_LISTE;
    Begin
      Select e.ename
        Bulk Collect Into ma_liste
        From emp e    
       Where Exists (Select Null 
                       From dept d
                      Where d.deptno = e.deptno
                    );
    End;
    Pour les exceptions la règle est simple gérez que les exceptions que vous pouvez traiter au niveau de cette procédure sinon laisse-les se propager vers la routine appelante.

Discussions similaires

  1. [ASE 12.5] DDL d'un objet type table
    Par lsone dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 08/08/2006, 10h42
  2. [PL/SQL] SELECT INTO avec type TABLE
    Par Kaejar dans le forum Oracle
    Réponses: 13
    Dernier message: 06/07/2006, 16h17
  3. Meilleur type table pour stocker des valeurs numérique
    Par vodevil dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/04/2006, 20h42
  4. BULK COLLECT ==> TYPE TABLE OF (Cursor Rowtype)
    Par argoet dans le forum Oracle
    Réponses: 5
    Dernier message: 17/05/2005, 16h47
  5. Problème avec les champs de type table
    Par devdev dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 16/12/2004, 16h05

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