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

Oracle Discussion :

Aide sur les packages


Sujet :

Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut Aide sur les packages
    Version Oracle : 9.2.1.0
    Système d'exploitation WINDOWS

    Bonjour
    J’ai créé un package pour gérer des mises à jour dans certaines tables, il est appelé dans plusieurs procédures et ce n’est pas les mêmes champs qui sont mis à jour
    Je n’ai trouvé que la solution de définir un type RECORD, je suppose qu’il y a une autre façon de procéder?
    J’ai essayer de passer par un curseur mais j’ai un problème avec les valeurs par défaut
    Voici une partie du code, merci pour vos conseils

    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
    CREATE OR REPLACE PACKAGE DOSSIER_PKG IS
     
    TYPE typ_dos is record (dossier    dos.dossier%type,
             	 		 dt_cre    dos.dt_cre%type ,
      			 dt_deb    dos.dt_deb%type ,
     			 dt_fin    dos.dt_fin%type ,
     			 option    dos.option%type default '0',
    			 ..... ,
    			 ..... ,			
    		   );			   
     
     rec_dos typ_dos ;
     
    procedure ajout_dossier;
    procedure Suppr_client;
    .....
    .....
     
    END DOSSIER_PKG;
    /
     
     
    CREATE OR REPLACE PACKAGE BODY DOSSIER_PKG IS
     
        PROCEDURE Ajout_Dossier
        IS
     
          BEGIN
               IF REC_DOS.dossier is null  Then
                  SELECT DOS.nextval INTO REC_DOS.dossier From dual;
     
                 INSERT INTO DOS(dossier,dt_cre,dt_deb,dt_fin, ..... , ........  ) 
                  VALUES(REC_DOS.dossier,
                              REC_DOS.dt_cre,
                              REC_DOS.dt_deb,
                              REC_DOS.dt_fin
                              ......
                              ...... 
                            ) ;
     
             ELSE
                  .............;
                  .............;
            END IF;
     
    END;
     
     
    END Dossier_pkg;
    /

  2. #2
    Membre habitué Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    Je n'ai pas compris votre question, qu'est ce que vous voulez faire exactement ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut
    Je voudrais savoir comment définir un type ayant la structure d'une table autrement que par un RECORD

  4. #4
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Je ne suis pas sûr d'avoir compris non plus, mais cela peut-être répondra à ton problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mavariable matable%rowtype;
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  5. #5
    Membre habitué Avatar de Process Linux
    Inscrit en
    Septembre 2003
    Messages
    136
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 136
    Points : 149
    Points
    149
    Par défaut
    voici un petit code qui réponde à ta question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    PACKAGE BODY nom_package
    IS
     
    rec_dos ma_table%rowtype;
     
    ...
    tu n'auras pas besoin de définir un type , le rowtype prend la structure de la table , en plus c'est dynamique.
    Est ce ca répond à ta question ?

  6. #6
    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
    Vous pouvez créer un objet basé (bien que la différence avec un record ne soit pas évidente dans votre cas)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE OR REPLACE TYPE TYP_XX AS OBJET
    (
      col1  Varchar2(10),
      col2  Number,
      ...
    )
    /
    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

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut
    J'ai fais un essai avec le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PACKAGE BODY nom_package 
    IS 
     
    rec_dos ma_table%rowtype;
    J'ai une erreur lorsque j'utilise rec_dos.mon_champ
    "Champ non défini"

  8. #8
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    et la colonne mon_champ existe bien dans la table ma_table ?
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut
    Oui, de plus le problème est sur tous les champs

  10. #10
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Bizarre, cela devrait fonctionner :
    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
    SQL> create table test_dvp (col1 varchar2(30), col2 varchar2(30))
      2  /
    Table created.
     
    SQL> insert into test_dvp values ('a', 'A')
      2  /
    1 row created.
     
    SQL> insert into test_dvp values ('b', 'B')
      2  /
    1 row created.
     
    SQL> insert into test_dvp values ('c', 'C')
      2  /
    1 row created.
     
    SQL> create or replace package pack_dvp is
      2    v_test_dvp test_dvp%rowtype;
      3    
      4    procedure affiche_col2_test_dvp (val_col1 in varchar2);
      5  end;
      6  /
    Package created.
     
    SQL> create or replace package body pack_dvp is
      2    procedure affiche_col2_test_dvp (val_col1 in varchar2) is
      3    begin
      4      select *
      5      into v_test_dvp
      6      from test_dvp
      7      where col1 = val_col1
      8        and rownum = 1;
      9      dbms_output.put_line (v_test_dvp.col1 || '=>' || v_test_dvp.col2);
     10    end;
     11  end;
     12  /
    Package body created.
     
    SQL> exec pack_dvp.affiche_col2_test_dvp ('a')
    a=>A
    PL/SQL procedure successfully completed.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    182
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 182
    Points : 66
    Points
    66
    Par défaut
    Merci beaucoup

  12. #12
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Citation Envoyé par plaineR
    Bizarre, cela devrait fonctionner :
    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
    SQL> create table test_dvp (col1 varchar2(30), col2 varchar2(30))
      ...
    SQL> create or replace package body pack_dvp is
      2    procedure affiche_col2_test_dvp (val_col1 in varchar2) is
      3    begin
      4      select *
      5      into v_test_dvp
      6      from test_dvp
      7      where col1 = val_col1
      8        and rownum = 1;
      9      dbms_output.put_line (v_test_dvp.col1 || '=>' || v_test_dvp.col2);
     10    end;
     11  end;
     12  /
    ...
    Je me demandais à quoi servait le ???
    Est ce que ca ne fait pas apparaitre forcément "a=>A" ???
    Dyvim

  13. #13
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Le rownum = 1 sert à ne ramener qu'une ligne.

    Dans mon exemple, cela ne sert à rien puisque je n'ai qu'une ligne dont la col1='a', si j'en avais eu plusieurs, seul la première ligne aurait été ramenée sans que j'ai à gérer l'exception too_many_rows.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  14. #14
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Merci ... cette astuce pourra certainement m'être utile un jour...
    Bien qu'une requete qui doit ramener une seule ligne et en ramène plusieurs soit en toute logique mal écrite ...
    Et je me trompais sur sa signification puisque le numéro de ligne(rownum) est celui du résultat et pas celui de la table d'origine...
    Dyvim

  15. #15
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par dyvim
    Bien qu'une requete qui doit ramener une seule ligne et en ramène plusieurs soit en toute logique mal écrite ...
    Pas forcément, par exemple, parfois tu as juste besoin de savoir s'il existe au moins un enregistrement correspondant à ta requête avant d'effectuer une action. Le rownum est pratique dans ce cas.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  16. #16
    Membre actif
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Eure (Haute Normandie)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 277
    Points
    277
    Par défaut
    Citation Envoyé par plaineR
    Pas forcément, par exemple, parfois tu as juste besoin de savoir s'il existe au moins un enregistrement correspondant à ta requête avant d'effectuer une action. Le rownum est pratique dans ce cas.
    Bah j'aurais plutôt fait un count(*)... mais le rownum=1 peut avoir son interêt...
    Dyvim

  17. #17
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Au niveau perf le count n'est vraiment pas terrible , il vaut mieux de loin utiliser le rownum
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  18. #18
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    au niveau perf ça ne change rien puisque le rownum ne s'applique que sur le fetch, toutes les données sont récupérées comme le COUNT

  19. #19
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Citation Envoyé par Fred_D
    au niveau perf ça ne change rien puisque le rownum ne s'applique que sur le fetch, toutes les données sont récupérées comme le COUNT

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SQL> select count(*) from matable;
     COUNT(*)
    ---------
       426840
     real: 2656
     
    SQL> select 1 from matable where rownum = 1;
            1
    ---------
            1
     real: 62
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

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

Discussions similaires

  1. besoin d'aide sur les ORB
    Par floorfille dans le forum CORBA
    Réponses: 4
    Dernier message: 24/08/2004, 15h43
  2. Aide sur les groupes (ADO)
    Par portu dans le forum QuickReport
    Réponses: 3
    Dernier message: 18/08/2004, 16h13
  3. Filemaker ... besoin d'aide sur les Plugin
    Par joange dans le forum Autres SGBD
    Réponses: 3
    Dernier message: 22/04/2004, 10h16
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 16h28
  5. [CR] besoin d'aide sur les formules
    Par GuillaumeDSA dans le forum Formules
    Réponses: 4
    Dernier message: 10/07/2003, 12h19

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