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 :

%ROWTYPE dans un TYPE RECORD


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut %ROWTYPE dans un TYPE RECORD
    Bonjour à tous,
    J'ai créé un type RECORD contenant un champs pointant sur une table.
    J'ai une commande update ou je souhaite retourné les éléments qui ont été modifié et enregistrer dans ce record pour efectué un traitement de ces informations dans plusieurs procédures. Le but est que je passe en paramètre de mes procédures ce record qui contiendra les rows modifié para mon update.

    Voici mon 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
    18
    19
    declare
       TYPE  RecMsg IS RECORD (
          recPO       IN_PO_PROCESS_ORDER%ROWTYPE
          ,sSite      MAP_SITE_PLANT.SITE_CODE%TYPE
          ,sStatOF    cms_adm.SO_PROCESS_ORDER.STAT_PO%TYPE
          ,sPec       MAP_SITE_PLANT.FLAG_PEC%TYPE
       );
     
     
    TYPE TblMsg IS TABLE OF RecMsg INDEX BY BINARY_INTEGER;
    aMsg TblMsg;
     
    begin
     
       UPDATE IN_PO_PROCESS_ORDER SET MSG_STATUS = 'I' 
       WHERE MSG_STATUS = 'C'
       RETURNING ACTION_CODE,MSG_ID,MSG_STATUS,MSG_DATE,
       INTO aMsg.recPO;
    end;
    Lorsque j'exécute j'ai un message d'erreur demandant que recPO soit déclaré.

    Aurriez-vous une solution?
    Je suis sous ORACLE 9i Release 2.

    Merci.

    Salvatore

  2. #2
    Membre habitué Avatar de h472009
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Août 2009
    Messages
    86
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Service public

    Informations forums :
    Inscription : Août 2009
    Messages : 86
    Points : 170
    Points
    170
    Par défaut
    Je pense que ton problème vient du faite que :

    là tu definit un tableau d'enregistrement indexé, donc lors de l'appel tu doit avoir quelque chose comme ça:

    ou i est l'index voulu.

    donc tu pourra pas récupérer les résultats voulu de tel façon.
    The Matrix has you.....

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Les enregistrements sont des structures PL/SQL qui ne sont pas reconnues par SQL. Si vous souhaitez partager une structure entre PL/SQL et SQL, dirigez-vous plutôt vers les objets stockés via la commande CREATE TYPE.

    Mais cela fonctionne aussi avec les collections:

    Retrieving DML Results into a Collection with the RETURNING INTO Clause

    You can use the BULK COLLECT clause in the RETURNING INTO clause of an INSERT, UPDATE, or DELETE statement:
    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 TABLE emp2 AS SELECT * FROM employees;
    DECLARE
       TYPE NumList IS TABLE OF employees.employee_id%TYPE;
       enums NumList;
       TYPE NameList IS TABLE OF employees.last_name%TYPE;
       names NameList;
    BEGIN
       DELETE FROM emp2 WHERE department_id = 30
          RETURNING employee_id, last_name BULK COLLECT INTO enums, names;
       dbms_output.put_line('Deleted ' || SQL%ROWCOUNT || ' rows:');
       FOR i IN enums.FIRST .. enums.LAST
       LOOP
          dbms_output.put_line('Employee #' || enums(i) || ': ' || names(i));
       END LOOP;
    END;
    /
    DROP TABLE emp2;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  4. #4
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Merci pour vos réponse.
    Dans les testes que j'ai efectué, celà fonctionne ci le update retourne seulement 1 enregistrement. Dans le cas contraire il y a une EXCEPTION sur dépassement d'enregistrement.

    Je vais voir comment résoudre. Car je tiens à passer entre les procédures le résultat du update et regroupé avec d'autre résultats sans avoir dans la déclaration de mes procédure un grand nombre de données.


    Salvatore Calà

  5. #5
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Justement le BULK COLLECT est utilisé lorsque plusieurs lignes sont retournées par l'ordre SQL. Voyez l'exemple donné précédement.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  6. #6
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Exactement, ceci je l'utilise déjà dans d'autre cas. Cette fois ci je voulais trouver une méthode pour joindre plusieur BULK COLLECT de diférent comande dans un RECORD afin d'y passer en paramètre dans une procédure.

    Dans le cas de ton exemple c'est exacte et j'ai toujours utilisé cette méthode en passant la variable du BULK en paramètre. Je voulais voir si je trouvais une méthode pour pousser un plus loin.

    Mais je vais me tenir à la méthode précédente que tu m'as informé.

    Dommage, j'aurais essayé. Je vais encore persévérer pour voir si une llumière s'affiche dans ma tête.

    Mais il est claire que ton example fonctionne extrèment bien, car je l'ai utilisé durant toutes mes années d'expérience. Mais je suis arrivé un point que je veux pousser mes connaissance plus loin.

    Encore merci et si ja'i bien compris tu est certifié ACE. Félicitation. Mois je me suis arrêté à l'OCP.

  7. #7
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    ACE n'est pas une certification. Tout juste une "distinction" attribuée par la communauté Oracle. Je pense que cela est plus facile à obtenir qu'une certification OCP et encore plus OCM !
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Je visualisais OCM dans ma tête. La certification OCP avec une bonne préparation et une expérience, elle est facile.

    Mais allons encore étudié si tu veux le bien mon idée (2 têtes pense toujours mieux qu'une). J'ai revu mon exemple et voici 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    /*    CREATE TABLE TEST_PO
        (
          PO_NUMBER  INTEGER,
          PROCESS    VARCHAR2(1 BYTE)                   DEFAULT 'c'
        )*/
    declare
       TYPE  RecMsg IS RECORD (
          recPO       TEST_PO%ROWTYPE
          ,sSite      MAP_SITE_PLANT.SITE_CODE%TYPE
         ,sStatOF    cms_adm.SO_PROCESS_ORDER.STAT_PO%TYPE
          ,sPec       MAP_SITE_PLANT.FLAG_PEC%TYPE
       );
     
       TYPE    TblMsg IS TABLE OF RecMsg;
       aMsg    TblMsg;
     
       TYPE    TblMsg1 IS TABLE OF TEST_PO%ROWTYPE;
       aMsg1    TblMsg1;
     
       i INTEGER;
    begin
       FOR i IN 1..100 LOOP
         INSERT INTO TEST_PO (PO_NUMBER) VALUES (i);
       END LOOP;    
     
       UPDATE TEST_PO SET PROCESS = 'I' WHERE PROCESS = 'c'
       RETURNING PO_NUMBER,PROCESS 
       BULK COLLECT INTO aMsg1;
     
    --   FOR i IN 1..SQL%ROWCOUNT LOOP
    --      aMsg(i).recPO := aMsg1(SQL%BULK_ROWCOUNT(i));
    --   END LOOP;            
     
     
    end;
     
    --    DROP TABLE TEST_PO

    Cette exemple fontionne bien et on récupère bien les données. Maitenant, j'ai esseyé de repasser le résultat dans mon RECORD par une boucle, par exemple.
    Tel que je l'ai écrit, celà ne marche pas et on à le retour d'erreur suivant :

    ORA-06531: Reference to uninitialized collection
    ORA-06512: at line 36


    Je vais persisté à trouver une solution propre.

  9. #9
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Oui, car il s'agit d'une NESTED TABLE et pas INDEX BY

    remplacez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TYPE    TblMsg1 IS TABLE OF TEST_PO%ROWTYPE;
    Par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     TYPE    TblMsg1 IS TABLE OF TEST_PO%ROWTYPE INDEX BY BINARY_INTEGER;
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    Très juste, ce fût ainsi que j'avais déclaré mais l'erreur persiste. Je vais continuer et surement j'aurais une solution. Si je la trouve j'informe la communauté développez.com.

    Celà pourra être utile.

    Salutations et à bientôt.

    Salvatore

  11. #11
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Etonnant. Une collection INDEX BY n'a pas besoin d'être initialisée (en dehors de sa déclaration). N'y a t-il pas confusion avec l'autre collection (aMsg) ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  12. #12
    Membre du Club
    Inscrit en
    Août 2002
    Messages
    36
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 36
    Points : 41
    Points
    41
    Par défaut
    J'ai trouvé. finalement 2 têtes pensentent en vaux mieu qu'une.
    Je te remercie pour ton aide. Je commençais à ne plus arriver à penser tellement obsédé pour une solution.

    Je vais développez ceci pour voir comment améliorer les performance. Je ne suis pas abitué au site développer. com, mais je pense que l'on peux déposer des articles et exemples.

    En tout cas encore merci pour ton aide et soutien.

    Salvatore Calà

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

Discussions similaires

  1. Problème de type RECORD dans PGSQL
    Par wangying dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 29/01/2013, 16h19
  2. Type Record dans un stream
    Par ed973 dans le forum Langage
    Réponses: 9
    Dernier message: 24/07/2012, 18h20
  3. Réponses: 5
    Dernier message: 07/04/2008, 09h33
  4. [PL/SQL] : %ROWTYPE dans un RECORD
    Par dcollart dans le forum Oracle
    Réponses: 1
    Dernier message: 13/12/2006, 13h25
  5. Structure de données de type "RECORD"
    Par chaours dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 30/09/2002, 17h10

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