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

SQL Oracle Discussion :

[Oracle 8i] returning bulk collect


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut [Oracle 8i] returning bulk collect
    Bonjour,

    Dans un bloc PL/SQL, j'essaie d'executer la requête ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    insert into table1 (val1, val2)
    select val1, val2 from table2
    returning val1 bulk collect into maCollection;
    J'ai le message d'erreur ORA-00933: La commande SQL ne se termine pas correctement

    J'ai lu qu'on pouvait utiliser le bulk collect avec un insert mais comme j'utilise un select je sais pas si c'est toujours valable.

    Quelqu'un peut-il m'aider ?
    Merci

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    92
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 92
    Par défaut
    Je vois pas trop ce que tu cherche a faire

    et bulk collect into n'est pas un fonction de la base 9i ??

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut
    Je veux récupérer une partie des valeurs insérer dans ma table table1 (en réalité mon select est un peu plus complexe)

    En tout cas, bulk collect into est bien une fonction de oracle 8i

    Je l'utilise pour mes delete et update

    Précision : si je fais un insert sans select le collect bulk into fonctionne bien. Dès que je rajoute le select, j'ai le message d'erreur oracle

  4. #4
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    pour un select :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    DECLARE
       TYPE SalList IS TABLE OF emp.sal%TYPE;
       sals SalList;
    BEGIN
       SELECT sal BULK COLLECT INTO sals FROM emp
          WHERE ROWNUM <= 100;
       ...
    END;
    utilisation des bulk collect avec update, insert delete exemple :
    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 TYPE PNum AS OBJECT (n NUMBER);
    /
    CREATE TABLE partno OF PNum;
     
    DECLARE
       TYPE NumTab IS TABLE OF NUMBER;
       nums NumTab := NumTab(1, 2, 3, 4);
       TYPE PNumTab IS TABLE OF PNum;
       pnums PNumTab := PNumTab(PNum(1), PNum(2), PNum(3), PNum(4));
    BEGIN
       FORALL i IN pnums.FIRST..pnums.LAST
          INSERT INTO partno VALUES(pnums(i));
       FORALL i IN nums.FIRST..nums.LAST
          DELETE FROM partno WHERE n = 2 * nums(i);
       FORALL i IN nums.FIRST..nums.LAST
          INSERT INTO partno VALUES(100 + nums(i));
    END;

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut
    Je ne vois pas bien dans le cas des update, delete, insert que tu cites comment tu utilises bulk collect

    Dans la doc oracle 8i, voici l'utilisation des bulk collect

    Bulk Returns
    You can use the BULK COLLECT clause in the RETURNING INTO clause of an INSERT, UPDATE, or DELETE statement, as the following example shows:

    DECLARE
    TYPE NumList IS TABLE OF emp.empno%TYPE;
    enums NumList;
    BEGIN
    DELETE FROM emp WHERE deptno = 20
    RETURNING empno BULK COLLECT INTO enums;
    -- if there were five employees in department 20,
    -- then enums contains five employee numbers
    END;
    http://download-west.oracle.com/docs...olls.htm#28329

    Mais dedans, ils ne font pas mention du cas cité dans mon 1er post

  6. #6
    Membre éclairé

    Inscrit en
    Septembre 2003
    Messages
    425
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 425
    Par défaut
    ok mais cet instructin récupére en fait les données supprimée, insérée ou mise à jour, j'avais pas compris, je monte un test pour voir mais cela me dit rien sorry

    Malheureusement je ne pense pas que cette instructino (insert + select) soit prise en compte dans un RETURING.

    je vois que ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select var1, var2  bulk collect into macollection from table2;
    FORALL j IN macollection.FIRST..macollection.LAST
       insert into table1 
       values(macollection(j).var1,macollection(j).var2);
    j'ai pas testé le code par contre

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 26
    Par défaut
    j'ai fais un test du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    type test_record is record(date_jour pa_calendrier.date_jour%type, fraction_jour pa_calendrier.fraction_jour%type);
    type test_table is table of test_record index by binary_integer;
    t_test test_table;
     
    select    cal.date_jour, cal.fraction_jour bulk collect into t_test
    from      pa_calendrier cal;
    mais j'ai le message d'erreur suivant :
    PLS-00597: l'expression 'T_TEST' dans la liste INTO est de type incorrect
    Je pense qu'on ne peut pas mettre deux variables dans une seule collection avec un bulk collect... à moins que je ne me sois trompé dans le type.

Discussions similaires

  1. [Oracle 9i] Bulk collect douteux
    Par Yoh dans le forum PL/SQL
    Réponses: 2
    Dernier message: 13/12/2010, 21h49
  2. Returning bulk collect into dans du sql dynamique
    Par puck78 dans le forum PL/SQL
    Réponses: 7
    Dernier message: 19/01/2009, 19h29
  3. Problème Bulk collect et Oracle 8
    Par ilalaina dans le forum SQL
    Réponses: 6
    Dernier message: 12/02/2008, 15h31
  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