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 :

[PROCEDURE STOCKEE] Tableau en parametre in


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mars 2005
    Messages
    251
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2005
    Messages : 251
    Points : 174
    Points
    174
    Par défaut [PROCEDURE STOCKEE] Tableau en parametre in
    Bonjour, je désirerais passer un tableau en paramètre d'entrée d'une procédure stockée et/ou fonction.

    En fait, le dev devrait pouvoir passer x arguments non obligatoire et le fonction construira une requete en fonction.

    Pouvez-vous m'aider ?

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Bruno2r
    Homme Profil pro
    Exploitation des données
    Inscrit en
    Décembre 2006
    Messages
    2 566
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Exploitation des données
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2006
    Messages : 2 566
    Points : 4 780
    Points
    4 780
    Par défaut x paramètres pourquoi un tableau ?
    Si j'avais un tel besoin et du fait que les paramètres sont facultatifs, je ne conceverait ma procédure qu'avec un seul argument !
    En revanche je passerais mes paramètres concaténés et séparés par un caractère délimiteur (par exemple '-')
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    maprocedure(mesparams IN VARCHAR2(500))
    ensuite je compterais mes '-' de séparation pour connaître le nombre de paramètres 
    ou bien je ferais une boucle tant que instr(mesparams,'-',i)>0 
    pour ramener chaque paramètre àl'aide de substr(mesparams,positiondébut, positionfin)
    Précisez la VERSION !
    Un message vous a aidé ? Votez en cliquant sur Pensez au bouton
    Tutoriels BO et FAQ BO
    "A vouloir repousser ses limites ... On risque d'en prendre connaissance !!!"

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Que ce soit via un tableau ou une chaine avec séparateur, tout les paramètres seraient passés en chaine de caractères, ce qui peut poser soucis... Des variables typées sont plus sûres. De plus, une chaine avec séparateur suppose que le séparateur n'apparaisse dans aucune des "variables", ce qui est vrai au début, mais ensuite

    Pour passer un tableau, il faut au préalable définir un type tableau, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE OR REPLACE TYPE VARCHAR2_TABLE AS TABLE OF VARCHAR2(4000);
    Ceci dit, si la problématique est juste d'avoir une procédure avec des paramètres facultatifs, PLSQL prévoit tout à fait ça grâce à la valeur DEFAULT que l'on peut donner à chaque paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PROCEDURE MaProc(
        strNom IN VARCHAR2,
        strPrenom IN VARCHAR2,
        strPays IN VARCHAR2 DEFAULT 'FRANCE',
        iDepartement IN NUMBER DEFAULT 34) IS...
     
    EXECUTE MaProc(strNom => 'DUTOUR', strPrenom => 'Jean');
    Et vous pouvez tester si la valeur est celle par defaut (NULL par exemple), ce qui signifie que le paramètre n'a pas été précisé.

    Cordialement,

    rbaraer

  4. #4
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Et vous pouvez tester si la valeur est celle par defaut (NULL par exemple), ce qui signifie que le paramètre n'a pas été précisé.
    Pas obligatoirement...
    Par exemple si tu passes 'FRANCE' pour strPays
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par Garuda
    Pas obligatoirement...
    Par exemple si tu passes 'FRANCE' pour strPays
    Oui j'ai donné un exemple avec des valeurs par défaut non nulles mais on peut aussi mettre DEFAULT NULL, c'est ce que je voulais dire , tout dépend de ce que l'on veut récupérer si le paramètre est absent.

    rbaraer

  6. #6
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    On ne peut JAMAIS vraiment savoir si le paramètre a été omis !
    Par exemple si tu passes 'FRANCE' pour strPays, comment la procédure peut elle savoir si c'est la valeur par défaut ou la valeur passée en paramètre ?
    Garuda गरूड
    Brahmâ la Guerre et Vishnu la Paix

    Oracle 12C R2 - Forms11GR2 - Toad 12 - sharePoint 2010

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    178
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 178
    Points : 220
    Points
    220
    Par défaut
    Citation Envoyé par Garuda
    On ne peut JAMAIS vraiment savoir si le paramètre a été omis !
    Par exemple si tu passes 'FRANCE' pour strPays, comment la procédure peut elle savoir si c'est la valeur par défaut ou la valeur passée en paramètre ?
    Une valeur par défaut non nulle comme 'FRANCE' est un mauvais exemple pour le cas présent, il servait juste à illustrer la possibilité de mettre une valeur par défaut. Mais on peut aisément mettre NULL en valeur par défaut et dire que si l'on a NULL, que le NULL ait été mis volontairement ou par omission, c'est que l'on n'est pas intéressé par ce paramètre. C'est une convention, je suis bien d'accord que ça ne différencie pas le NULL volontaire de l'omission, mais on ne pourrait pas faire mieux avec un tableau ou une chaine avec séparateur, et je considère ça beaucoup plus propre .

    Nous avons été confronté à ce problème, et pour lever l'ambigüité "NULL" ou "Non renseigné", on a créé des types Objet OBJ_NUMBER, OBJ_VARCHAR2... construits comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TYPE OBJ_VARCHAR2 AS OBJECT(
        Value VARCHAR2(400));
    /
    CREATE OR REPLACE TYPE OBJ_NUMBER AS OBJECT(
        Value NUMBER);
    /
    Ensuite, on passe des paramètres OBJ_XXX aux procédures au lieu des types simples et si le paramètre objet lui-même est NULL, c'est que l'on ne veut pas tenir compte du paramètre, si l'objet est non NULL mais l'attribut Value est NULL, c'est que le NULL est volontaire. En fait dans tous les cas où l'objet est non nul, on prend sa valeur. C'est un peu lourd mais ça marche. Il y a bien entendu d'autres solutions pour lever cette ambigüité (comme passer non pas 1 tableau en paramètre, mais 2 : 1 avec les valeurs des paramètres et 1 avec des indicateurs "renseigné" ou "non renseigné") mais aucune n'est très simple... C'est pourquoi si l'on peut mettre DEFAULT NULL et considérer par convention NULL comme "non renseigné", c'est plus simple. Dans certains cas ça suffit, dans d'autres non .

    rbaraer

Discussions similaires

  1. [Procedure stockee] Passer en parametre une array / tableau
    Par Baltak dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 14/12/2011, 15h30
  2. Procedure stockee : mettre tableau en parametre
    Par firejocker dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 22/12/2007, 11h20
  3. Nom de colonne en parametre dans procedure stockee
    Par davidou2001 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 11/06/2007, 17h26
  4. passer un tableau a une procedure stockee
    Par graphicsxp dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/04/2005, 11h39
  5. [VB6] [ADO] Procedure stockée : spécifier les paramètres
    Par adepdoom dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 16/10/2002, 10h45

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