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 :

Fonction pour compter argmuments


Sujet :

PL/SQL Oracle

Vue hybride

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut Fonction pour compter argmuments
    Bonjour,

    Je cherche une fonction (ou en bâtir une) qui me permettrait de savoir si j'ai plus d'un argument dans une liste.
    Cette fonction prendrait une liste de n paramètres un peu comme greatest.

    Pour info c'est parce que j'ai un @Prompt de BO qui m'envoie cette chaîne sous Oracle ('ACP' , '118', 'ZA' .... variable) ... il me faut quelque chose pour modifier cette chaîne afin de savoir si j'ai un ou plusieurs arguments.

    Je ne peux pas convertir en chaîne ('ACP', '118', 'ZA') et mesurer la longueur ou faire un INSTR sur la virgule car j'ai une erreur sur la parenthèse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select instr( to_char('819' , '901') , ',') from dual
    --======> erreur
    concat fonctionne presque mais c'est deux arguments seulement !!!

    Merci.

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    C'est pas clair : Tu dis que BO te renvoie une chaine, puis tu dis que tu veux la transformer en chaine pour compter le nombre de ,

    Peux tu préciser en redonnant 1 exemple plus précis (et le même du début à la fin)

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    ok, en fait voici comment est codée ma condition BO. Le but de tout ça est de faire échouer le IN (ramène rien) si l'utiliateur choisit plusieurs valeurs (ce serait long pourquoi je dois faire ça ;-). cela ne doit fonctionner qu'avec une valeur. exemple de choix : ACP ça fonctionne mais ACP;ACT;ACZ ça doit ramener rien et non pas ACP (le bon comportement du IN seul.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ( @Select(Performances\Portefeuille performance) IN
          @Prompt('Selectionnez un ou plusieurs portefeuilles (# pour tous) : ','A','Fonds, Sections, Portefeuilles\Portefeuilles',multi,constraigned) AND 
     
    length (
    concat 
    @Prompt('Selectionnez un ou plusieurs portefeuilles (# pour tous) : ','A','Fonds, Sections, Portefeuilles\Portefeuilles',multi,constraigned) 
    ) <=4
     
    )
    pour info BO transforme ACP;ACT;ACZ en ('ACP','ACT','ACZ') ...
    la fonction ci-dessus fonctionne très bien mais seulement pour 2 paramètres car concat n'accepte que 2 arguments ... ca foire pour 1 argument et 3 arguments ...

    il me faut un concat () qui accepte n arguments comme greatest ou alors coder une fonction qui fait ça ...

    c'est mieux là

    merci en tous cas

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Je ne suis pas certain d'avoir bien cerné votre problème, mais ceci pourrait vous aider pour compter le nombre d'arguments récupérés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select count(*) from table(sys.odcivarchar2list('ACP'));
    -- 1
     
    select count(*) from table(sys.odcivarchar2list('ACP','ACT','ACZ'));
    -- 3

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    SELECT count(*) FROM TABLE(sys.odcivarchar2list('ACP'));
    merci mais cet appel ne fonctionne pas sur ma base (droits ?) ...

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Peut-être la version, pas sûr que ça fonctionne sur une version antérieure à la 10g.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut Pbm Fonction pour compter argmuments
    Bonjour,

    Business Object passe à ma base oracle ce genre de chaîne ('ACP', '118', 'ACT' ... ). J'ai besoin de détecter sous oracle si j'ai plus d'un argument là dedans.

    j'ai 3 pistes,

    1/ la 1ère avec to_char, si j'arrive a convertir en chaîne ensuite je fais un INSTR et si je trouve une virgule c'est bon, j'ai plusieurs arguments. problème,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT instr( to_char('  ('ACP', '118', 'ACT')  ') , ',') FROM dual
    ======> erreur
    comment faire pour convertir en chaîne ce truc avec des caractères spéciaux ? je ne peux rajouter des trucs que devant et derrière.

    2/ avoir une fonction comme greatest ou une sorte de concat avec n arguments ...

    3/ écrire une fonction qui me permettrait de savoir si j'ai plus d'un arguments dans une liste. Cette fonction prendrait une liste de n paramètres un peu comme greatest. Ou a defaut si c'est pas faisable un tableau de Varchar2 ...

    j'en suis là :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CREATE OR REPLACE
    TYPE DUARPDFE.MYTYPE AS VARRAY(5) OF VARCHAR2(50) ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE OR REPLACE FUNCTION DUARPDFE.concatenation (t_in MyType) RETURN VARCHAR2 IS
        l_return VARCHAR2(32767);
    BEGIN
         FOR i IN 1..t_in.count LOOP
            l_return := l_return || ',' || t_in(i);
        END LOOP;
    RETURN t_in.count;
    END concatenation;
    mais ça ne fonctionne pas, cet appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select duarpdfe.concatenation('ACP' , '118', 'ACP') from dual
    me retourne une erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORA-06553: PLS-306: numéro ou types d'arguments erronés dans appel à 'CONCATENATION'
    any idea ???

    merci beaucoup en tous cas pour votre aide !

  8. #8
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par Jeff.p18 Voir le message
    Cette fonction prendrait une liste de n paramètres un peu comme greatest.
    Est-ce qu'il ne serait pas possible alors d'utiliser:
    greatest(...)=least(...)
    qui n'est vrai que s'il y a qu'un seul argument ?
    Cordialement,
    Franck.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 67
    Par défaut
    bravo, c'est une très bonne solution !!! en effet ça marche bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select case when greatest ('ACP', 'ACT', 'ACZ') = least ('ACP', 'ACT', 'ACZ') then 1 else 0 end  from dual
    sinon en moins élégant j'avais ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE
    TYPE DUARPDFE.MYTYPE AS VARRAY(500) OF VARCHAR2(50) ;
     
    CREATE OR REPLACE FUNCTION DUARPDFE.f_compte_arguments (t_in MyType) RETURN VARCHAR2 
    IS
    BEGIN
        RETURN t_in.count;
    END f_compte_arguments;
     
    select duarpdfe.f_compte_arguments(DUARPDFE.MYTYPE('ACP' , '118', 'ACP')) from dual
    merci @ tous

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

Discussions similaires

  1. fonction pour compter le nombre de personne dans une tranche d'age
    Par djo007 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/02/2012, 00h03
  2. Réponses: 7
    Dernier message: 19/09/2009, 00h05
  3. Réponses: 10
    Dernier message: 07/01/2009, 10h20
  4. fonction pour compter
    Par iceman1 dans le forum IHM
    Réponses: 1
    Dernier message: 31/01/2008, 15h59
  5. fonction pour compter le nombre de checkbox coché ?
    Par Death83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/09/2005, 11h28

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