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 :

Bulk Collect et selection multi champs [8i]


Sujet :

PL/SQL Oracle

  1. #1
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut Bulk Collect et selection multi champs
    Bonjour à tous,

    Contexte :

    Je cherche à développer une procédure qui génère des requêtes de sélection puis les exécute et renvoie le résultat obtenu.

    La table sur laquelle la requête va être exécutée n'est pas connu à l'avance, le nombre de tuple retournée par la requête va de 0 à plusieurs.

    Synoptique de mon traitement :

    Les éléments nécessaires à la génération de la requête (SELECT, FROM et WHERE) sont passés en paramètre et ma requête est correctement générée en chaîne de caractères afin d'être exécutée via EXECUTE IMMEDIATE.

    Le résultat obtenu est stocké dans une instance d'un objet ot_table défini comme ci-dessous (ot_table1 et ot_table2 sont à l'image de deux tables) :
    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
    CREATE TYPE ot_table1 AS OBJECT
    (
       champ1 NUMBER(10),
       champ2 NUMBER(1),
       champ3 NUMBER(2)
    );
    /
     
    CREATE TYPE ot_table2 AS OBJECT
    (
       champ1 NUMBER(10),
       champ2 NUMBER(1),
       champ3 NUMBER(2)
    );
    /
     
    CREATE TYPE arr_table1 AS TABLE OF ot_table1;
    /
    CREATE TYPE arr_table2 AS TABLE OF ot_table2;
    /
     
    CREATE TYPE ot_tables AS OBJECT
    (
       tbl_table1 arr_table1,
       tbl_table2 arr_table2
    );
    /
     
    FUNCTION FCT_select(i_tblSelects IN arr_tblSetters,
                        i_tblConditions IN arr_tblConditions,
                        i_table IN VARCHAR2) RETURN ot_tables IS
    l_signature VARCHAR(1000) := 'PCK_GACDataAccess.FCT_select';
    l_query VARCHAR2(5000) := NULL;
    l_increment NUMBER(3) := 1;
    l_tables ot_tables := ot_tables(NULL, NULL);
    BEGIN
       l_query := 'BEGIN
                      SELECT ';
       l_query := FCT_genererListeChamps(l_query, i_tblSelects);
       --l_query := l_query||' BULK COLLECT INTO :1';
       l_query := l_query||' FROM '||i_table;
       l_query := FCT_genererClauseWhere(l_query, i_tblConditions);
       l_query := l_query||';
                   END;';
       print_out(l_query);
       IF UPPER(i_table) = UPPER('Table1') THEN
          dbms_output.put_line('test 1');
          --EXECUTE IMMEDIATE l_query INTO l_tables.tbl_table1;
          EXECUTE IMMEDIATE l_query BULK COLLECT INTO l_tables.tbl_table1;
          dbms_output.put_line('test 2');
          dbms_output.put_line('Identifiant récupéré : '||l_tables.tbl_table1(0).champ1);
          dbms_output.put_line('test 3');
       ELSIF UPPER(i_table) = UPPER('Table2') THEN
          EXECUTE IMMEDIATE l_query BULK COLLECT INTO l_tables.tbl_table2;
       END IF;
       RETURN l_tables;
     
       EXCEPTION
          WHEN OTHERS THEN
             print_out(l_query);
             RAISE_APPLICATION_ERROR(-20101, l_signature||' '||SQLERRM(SQLCODE));
    END FCT_select;
    En l'état actuel de mon dév j'obtiens le message d'erreur suivant lors de la compilation :
    PLS-00103: Symbole "BULK" rencontré à la place d'un des symboles suivants :
    . < * @ % & = - + ; < / > etc...
    Si j'utilise la façon de procéder qui est commentée et que j'ai volontairement laissé dans le corps de la procédure FCT_select, j'obtiens lors de l'exécution du traitement :
    ORA-20101: PCK_GACDataAccess.FCT_select ORA-01008: Toutes les variables ne sont pas liées.
    Je pense que mon soucis repose principalement l'utilisation du BULK COLLECT alors qu'il y a plusieurs champs dans le SELECT. Les exemples que je trouve sur le web n'ont qu'un seul champ dans le SELECT.

    Quelqu'un pourrait me donner un coup de main ?

  2. #2
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Ecrivez une fonction qui renvoie un ref_curseur (variable de type curseur) dans ce cas.

  3. #3
    Membre confirmé Avatar de Kihmé Xs
    Inscrit en
    Janvier 2007
    Messages
    549
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Janvier 2007
    Messages : 549
    Points : 491
    Points
    491
    Par défaut
    Merci mnitu, c'est ce qu'il me fallait, ça fonctionne et en plus je n'ai plus à trimbaler des object types.

  4. #4
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par Kihmé Xs Voir le message
    ...ça fonctionne et en plus je n'ai plus à trimbaler des object types.

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

Discussions similaires

  1. update d'un champ avec select multi-table
    Par maxvador dans le forum Hibernate
    Réponses: 1
    Dernier message: 23/09/2009, 11h54
  2. Modification de champs issus d'un select multi table
    Par plancade dans le forum Requêtes
    Réponses: 1
    Dernier message: 20/06/2007, 16h25
  3. [Performance] RecordCount ou select Count(champ) ?
    Par shwin dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 28/09/2004, 17h37
  4. BULK COLLECT
    Par ghostlord79 dans le forum SQL
    Réponses: 3
    Dernier message: 06/08/2004, 13h42
  5. failed BULK COLLECT
    Par patmaba dans le forum SQL
    Réponses: 7
    Dernier message: 01/06/2004, 12h03

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