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 :

[PLSQL] TYPE RECORD


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut [PLSQL] TYPE RECORD
    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
     
    CREATE OR REPLACE PACKAGE Mon_Package IS 
     
      TYPE t_rec_prog IS RECORD (num prog.id%TYPE, 
                                                 nom prog.nom%TYPE, 
                                                 type prog.type%TYPE); 
     
      TYPE tab_t_rec_prog IS TABLE OF T_REC_BUG INDEX BY BINARY_INTEGER; 
     
      FUNCTION MesProg (p_i NUMBER, 
                                    p_parametre1 NUMBER, 
                                    p_parametre1 NUMBER ) RETURN TAB_T_REC_PROG; 
     
    END Mon_Package; 
    / 
     
    CREATE OR REPLACE PACKAGE BODY Mon_Package IS 
     
    FUNCTION MesProg (p_i NUMBER, 
                                  p_parametre1 NUMBER, 
                                  p_parametre1 NUMBER) RETURN T_REC_PROG IS 
     
     CURSOR curs IS SELECT num, nom, type 
                              FROM prog 
                              WHERE nom = p_parametre1 
                                          AND type = p_parametre2; 
     
    t_rec TAB_T_REC_PROG; 
    i NUMBER := 1; 
     
    BEGIN 
      FOR rec IN curs LOOP 
        t_rec(i).num := rec.num; 
        t_rec(i).nom := rec.nom; 
        t_rec(i).type := rec.type; 
        i := i+1; 
      END LOOP; 
     
      RETURN(t_rec(p_i)); 
     
    END Mon_Package; 
    /
    Je fais ensuite appel a cette fonction mais comment acceder a chaque element du record?
    Mon_Package.MesProg(i, param1, param2).id ??????????
    Mon_Package.MesProg(i, param1, param2).nom ??????????
    Mon_Package.MesProg(i, param1, param2).type??????????
    [/code]

  2. #2
    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
    Oui par exemple ou tu peux également faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    declare
       mavar t_rec_prog;
    begin
       mavar := Mon_Package.MesProg(i, param1, param2);
       if mavar.id = ...
    end;
    ... ce qui à l'avantage de n'exécuter qu'une fois le code de ta fonction, ce qui peut améliorer les temps de réponse.
    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.

  3. #3
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Un chtite exemple qui fonctionne avec 2 fonctions

    1 qui ramene une collection (table) et l'autre qui ramene un record (like you want !!! )

    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 OR REPLACE PACKAGE Mon_Package IS 
     
      TYPE t_rec_prog IS RECORD (num prog.num%TYPE, 
                                                 nom prog.nom%TYPE, 
                                                 type prog.type%TYPE); 
     
     
      TYPE tab_t_rec_prog IS TABLE OF T_REC_PROG INDEX BY BINARY_INTEGER; 
     
      FUNCTION TAB_MesProg (p_i NUMBER) RETURN TAB_T_REC_PROG; 
      FUNCTION REC_MesProg (p_i NUMBER) RETURN T_REC_PROG; 
     
    END Mon_Package; 
    / 
    ;
    show err
    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
     
    CREATE OR REPLACE PACKAGE BODY Mon_Package IS 
     
    -----------------------------------------------------------------
    ---  Ramene une collection d'enregistrements
    -----------------------------------------------------------------
    FUNCTION TAB_MesProg (p_i NUMBER) RETURN TAB_T_REC_PROG IS 
     
     CURSOR curs IS SELECT num, nom, type FROM prog where num = p_i;
     
      t_rec TAB_T_REC_PROG; 
      i NUMBER := 1; 
     
    BEGIN 
      FOR rec IN curs LOOP 
        t_rec(i).num := rec.num; 
        t_rec(i).nom := rec.nom; 
        t_rec(i).type := rec.type; 
        i := i+1; 
      END LOOP; 
     
      RETURN(t_rec); 
     
    END TAB_MesProg;
    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
     
     
    -----------------------------------------------------------------
    ---  Ramene  1 Enreg
    -----------------------------------------------------------------
    FUNCTION REC_MesProg (p_i NUMBER) RETURN T_REC_PROG IS 
     
     CURSOR curs IS SELECT num, nom, type FROM prog where num = p_i;
     
      t_rec TAB_T_REC_PROG; 
      i NUMBER := 1; 
     
    BEGIN 
      FOR rec IN curs LOOP 
        t_rec(i).num := rec.num; 
        t_rec(i).nom := rec.nom; 
        t_rec(i).type := rec.type; 
        i := i+1; 
      END LOOP; 
     
      RETURN(t_rec(p_i)); 
     
    END REC_MesProg; 
     
    END Mon_Package; 
    / 
    ;
    show err
    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
     
     
    Set Serveroutput on;
     
    Declare
        Result Mon_Package.tab_t_rec_prog;
    Begin
        Result := Mon_Package.TAB_MesProg(1);
     
        Dbms_output.put_line(Result(1).nom);
        Dbms_output.put_line(Result(2).nom);
     
        Dbms_output.put_line(Mon_Package.REC_MesProg(1).nom);
        Dbms_output.put_line(Mon_Package.REC_MesProg(2).nom);
     
    End;
    /
    Signé : Capitaine Jean-Luc Picard

  4. #4
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    Genial les collections, je vais utiliser plus souvent!
    Pour des questions de perf je vais plutot retourner au travers de ma fonctions une collection d'enregistrements (FUNCTION TAB_MesProg (p_i NUMBER) RETURN TAB_T_REC_PROG ) et ainsi comme le disait PlaineR,
    ma fonction sexecute une fois me retourne tous les records dont jai besoin!

    Ca marche pile poil sauf que jai un petit probleme sql
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    date BETWEEN TO_DATE(NVL(p_date_parametre1,'19000101'), 'DD/MM/YYYY') AND TO_DATE(p_dateparametre2, DD/MM/YYYY'))
    AND type = NVL(DECODE(p_type_parametre, 'LAGIER', 1, 'TRACIER', 2),  type)
    AND description LIKE NVL('%' || TRIM(REPLACE(description_parametre, CHR(10), CHR(32))) || '%',description )
    Nous sommes daccord que avec un tel code concernant notemment les types, je devrais avoir les types recherches si le "p_type_parametre" est renseigne et tous les types de ma table si le "p_type_parametre" nest pas renseigne cad les records ou le type est null dans la table egalement?
    De meme pour le description!!
    Pourtant il retourne pas les records dont ces champs sont null!!

    Si vous voyez le truc merci
    Sinon ben merci a tous pour les collections, c vachement utile apperement!

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Points : 73
    Points
    73
    Par défaut
    il n'y aurait point une pitite erreur de format de date dans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    TO_DATE(NVL(p_date_parametre1,'19000101'), 'DD/MM/YYYY')
    ?

  6. #6
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    oups
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    date BETWEEN TO_DATE(NVL(p_date_parametre1,'01/01/1900'), 'DD/MM/YYYY') AND TO_DATE(p_dateparametre2, DD/MM/YYYY')) 
    AND type = NVL(DECODE(p_type_parametre, 'LAGIER', 1, 'TRACIER', 2),  type) 
    AND description LIKE NVL('%' || TRIM(REPLACE(description_parametre, CHR(10), CHR(32))) || '%',description )
    Mais ca ne vient pas de la jai juste fais une erreur en recopiant!

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 64
    Points : 73
    Points
    73
    Par défaut
    et avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    AND nvl(type,0) = NVL(DECODE(p_type_parametre, 'LAGIER', 1, 'TRACIER', 2),  0)
    ?

  8. #8
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    oui merci ca marche mais je comprends pas pourquoi

    type = NVL(DECODE(p_type_parametre, 'LAGIER', 1, 'TRACIER', 2), type)

    ne fonctionnait pas!

    Tu as une idee pour la date? Quand la base a ete cree le champ date a ete defini comme NULL POSSIBLE si bien que beaucoup de records nont pas de date et jaimerais que ces records soient retournee au demandeur si dans mon formulaire le champ date nest pas renseigne!
    En effet dans mon code si le champ date du formulaire nest pas renseigne jimpose une recherche entre 01/01/1900 et sysdate ce qui ninclue pas les dates NULL!

  9. #9
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    parce qu'une egalite sur une valeur null est "inconsidérée" par oracle
    regardes , si tu fais dans ta requete : seul les record avec type renseigné seront selectionnés
    Signé : Capitaine Jean-Luc Picard

  10. #10
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    en effet logique merci!
    Mais pour la date vous feriez comment?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    BETWEEN TO_DATE(NVL(p_date_parametre1,'01/01/1900'), 'DD/MM/YYYY') AND TO_DATE(p_dateparametre2, DD/MM/YYYY'))
    Je veux faire afficher les records NULL pour la date au cas ou les champs dates dans les formulaisres ne sont pas renseignes!

  11. #11
    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
    porquoi ne pas faire tout bêtement ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    date_ BETWEEN TO_DATE(NVL(p_date_parametre1,'01/01/1900'), 'DD/MM/YYYY') AND TO_DATE(p_dateparametre2, DD/MM/YYYY')) 
    or date is null
    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.

  12. #12
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Nvl date au 01/01/1900 = cas du paramtre non renseigné : dans le cas contraire à priori parametre 1 est > au 01/01/1900 donc pas d'égalité

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    where nvl(Ma_table.date,to_date('01/01/1900','DD/MM/YYYY'))
          BETWEEN To_Date(NVL(p_date_parametre1,'01/01/1900'), 'DD/MM/YYYY') And 
                  To_Date(NVL(p_date_parametre2,'01/01/1900'), 'DD/MM/YYYY')
    Signé : Capitaine Jean-Luc Picard

  13. #13
    Membre à l'essai
    Inscrit en
    Juin 2004
    Messages
    29
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 29
    Points : 16
    Points
    16
    Par défaut
    ok merci beaucoup argoet!

    PlaineR, si je met un "or date is null", dans ce cas je ramene les records dont la date est nulle meme si le champ date est renseigne dans le formulaire!

  14. #14
    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
    Rien ne t'empêche de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (date_ BETWEEN p_date_parametre1 and p_date_parametre2
    or (p_date_parametre1 is null and date is null))

    Perso, j'aime pas les valeurs par défaut, c'est souvent risque de bug, si elles sont mal pensées ! En plus je trouve cela plus lisible.

    Question subsidiaire : que ce passe-t-il si ton paramètre p_date_parametre2 est null ?
    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. Fichier type Record et ListView
    Par aliwassem dans le forum Langage
    Réponses: 4
    Dernier message: 01/12/2005, 15h30
  2. [PL/SQL] : type record et FORALL
    Par PpPool dans le forum Oracle
    Réponses: 10
    Dernier message: 18/10/2005, 19h35
  3. [LG]fichier typé; record et pointeurs
    Par rigel dans le forum Langage
    Réponses: 6
    Dernier message: 12/05/2004, 16h12
  4. [LG]Resultat de fonction de type Record ?
    Par Mike888 dans le forum Langage
    Réponses: 10
    Dernier message: 24/01/2004, 22h48
  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