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

Apex Oracle Discussion :

Nombre de caractères dans une LOV


Sujet :

Apex Oracle

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut Nombre de caractères dans une LOV
    Bonjour tout le monde

    Je développe sous apex depuis un peu plus de 4 ans mais aujourd'hui je suis bloqué sur une LOV pour une Liste Select

    Ma requête pour cette LOV fait 7174 caractères mais les LOV sont limitées a 4000 caractères.
    Quelqu'un sait comment augmenter cette taille??

    Merci pour votre aide

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

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Je ne pense pas que ce soit possible d'augmenter la taille.

    Erreur en mettant une requête SQL de plus de 4000 car : "ORA-01461: can bind a LONG value only for insert into a LONG column "

    Par contre, tu peux modifier ta requête de LOV pour en faire une function de type PIPELINED http://sheikyerbouti.developpez.com/...age=Chap4#L4.4
    Du coup, la définition dans Apex sera courte, et tu peux mettre ce que tu veux en PLSQL.
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Merci pour cette piste

    Je vais voir ce que ça donne.

    Si je n'y arrive pas, pourras-tu me donner un exemple de fonction et comment l'appeler dans Apex ?

    Je commence par regarder ton lien
    Merci

  4. #4
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Bien sur, si tu n'y arrives pas, je te ferai un exemple, le forum sert à ça
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Voici ou j'en suis :

    on va dire que ça c'est ma requête qui fait 7000 caractère :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select b.BAT_LIBELLE as display_value
          , b.BAT_CDN as return_value
      from MOUV65.BATIMENT b

    J'ai créer 2 objet comme le disais ton lien
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    create type AGENT_P10 as object (lib_bat varchar2(64), cdn_bat number(8)) ;
     
    create type tab_agent_P10 as table of AGENT_P10 ;

    ensuite j'ai créer la fonction suivante :
    Code sql : 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 FUNCTION "MOUV65"."LOV_AGENT_P10_V1" (cur_lig in SYS_REFCURSOR)
    return tab_agent_P10 PIPELINED
    IS
      LBat AGENT_P10 := AGENT_P10 (null, null);
      RBat MOUV65.BATIMENT%rowtype;
    BEGIN
      Loop
        Fetch cur_lig into RBat;
        Exit when cur_lig%notfound;
          --manip des données --
          LBat.lib_bat := RBat.BAT_LIBELLE;
          LBat.cdn_bat := RBat.BAT_CDN;
          --retour des valeurs --
          PIPE ROW (LBat);
      END LOOP;
      Return;
    END;

    Le problème c'est que quand je veux utiliser tout ça pour l'instant je dois utiliser :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select lib_bat, cdn_bat from
    table(LOV_AGENT_P10_V1(cursor(select * from BATIMENT)))

    Mais si je dois passer tout le cursor en paramètre (mon cursor va etre trop gros pour rentrer dans la LOV

    Je comprend pas comment faire pour pouvoir faire la même chose mais en déclarent mon cursor dans ma fonction et non en paramètre.

    Je sais pas si je suis très claire

    Du coup si tu a un exemple tout simple pour comprendre je suis preneur
    Merci

  6. #6
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Ah.. en fait il manque quelque chose surement dans le tuto.

    Ta fonction peut tout gérer, tu peux y passer des paramètres

    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
    CREATE OR REPLACE FUNCTION "MOUV65"."LOV_AGENT_P10_V1" (param1 IN NUMBER)
    return tab_agent_P10 PIPELINED
    IS
      LBat AGENT_P10 := AGENT_P10 (null, null);
    BEGIN
      FOR r IN (select b.BAT_LIBELLE as display_value, b.BAT_CDN as return_value
                 from MOUV65.BATIMENT b
                 where bat_cdn = param1)
      Loop
          LBat.lib_bat := r.BAT_LIBELLE;
          LBat.cdn_bat := r.BAT_CDN;
          --retour des valeurs --
          PIPE ROW (LBat);
      END LOOP;
      Return;
    END;
    Ensuite il te suffit d'appeler par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT bat_libelle, bat_cdn
    FROM TABLE ("MOUV65"."LOV_AGENT_P10_V1" (	num))
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  7. #7
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Merci pour ton aide McM
    Je test tout ça des que possible et je ne manquerais pas de te dire si ça marche ou non.

    Sinon il y a une autre solution au problème que je n'ai pas encore testé.

    L'idée consiste a créer une vue, correspondant à la requête et retournant deux colonnes seulement, avec comme alias de colonnes
    D (ce que la vue affiche) et R la (clé que la LOV va retourner).

    Il est possible dans la vue de faire référence aux valeurs des élément APEX avec par exemple

    v('P2_CRITERE') ou nv ('P_NUMERO')

    Il suffira ensuite dans la définition d’appeler la vue avec par exemple :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select D, R 
    from Ma_Vue
    order by 1

    C'est aussi une piste, elle te servira peu être un jour.

  8. #8
    Membre habitué
    Inscrit en
    Octobre 2006
    Messages
    360
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 360
    Points : 197
    Points
    197
    Par défaut
    Bonjour McM

    Je pense que je ne suis plus tres loin mais je n'arrive pas à finaliser.

    Voix-tu m'on erreur??

    Voici le code de ma fonction :
    Code sql : 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
    CREATE OR REPLACE FUNCTION "MOUV65"."LOV_AGENT_P10_V2" (param1 in NUMBER)
    return tab_agent_P10 PIPELINED
    IS
      LBat AGENT_P10 := AGENT_P10 (null, null);
      RBat MOUV65.BATIMENT%rowtype;
      TYPE r_cursor IS REF CURSOR;
      C r_cursor;
    BEGIN
     --            
      OPEN C FOR 'select b.BAT_LIBELLE as display_value, b.BAT_CDN as return_value
                  from MOUV65.BATIMENT b
                  where b.BAT_CDN >= ' || param1;
      Loop
        Fetch C into RBat;
        Exit when C%notfound;
          --manip des données --
          LBat.lib_bat := RBat.BAT_LIBELLE;
          LBat.cdn_bat := RBat.BAT_CDN;
          --retour des valeurs --
          PIPE ROW (LBat);
      END LOOP;
      Return;
    END;
    Le statut de cette fonction est Valide


    Puis j'exécute la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT lib_bat as displaye_value, cdn_bat as return_value
    FROM TABLE ("MOUV65"."LOV_AGENT_P10_V2"(1));

    Mais j'ai le message d'erreur suivant :
    15:33:40 [SELECT - 0 row(s), 0.000 secs] [Error Code: 1722, SQL State: 42000] ORA-01722: Nombre non valide
    ORA-06512: à "MOUV65.LOV_AGENT_P10_V2", ligne 14
    ... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]

    Je suis a cour d'idée, j'espere que tu vas voir où ça coince

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    J'ai corrigé mon post (j'avais laissé 2 rbat. au lieu de r.)
    Vire de ton code tout ce qui est inutile, préfère un FOR LOOP à un Open Curseur (qu'il faut fetcher, fermer, etc..)

    Pour débugguer, vire le paramètre de ta fonction, histoire d'avoir un code minimaliste qui marche (et éliminer le max de problème qui pourrait survenir)

    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 FUNCTION "MOUV65"."LOV_AGENT_P10_V2" 
    return tab_agent_P10 PIPELINED
    IS
      LBat AGENT_P10 := AGENT_P10 (null, null);
     BEGIN
     --            
      FOR C IN (select b.BAT_LIBELLE as display_value, b.BAT_CDN as return_value
                  from MOUV65.BATIMENT b)
      Loop
          --manip des données --
          LBat.lib_bat := C.BAT_LIBELLE;
          LBat.cdn_bat := C.BAT_CDN;
          --retour des valeurs --
          PIPE ROW (LBat);
      END LOOP;
      Return;
    END;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE ("MOUV65"."LOV_AGENT_P10_V2");
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Calcul d'un nombre de caractères dans une chaîne
    Par Thekiller dans le forum Langage
    Réponses: 7
    Dernier message: 08/02/2010, 23h21
  2. [Excel] Nombre de caractères dans une plage
    Par fred014 dans le forum Delphi
    Réponses: 20
    Dernier message: 02/03/2007, 21h32
  3. Réponses: 10
    Dernier message: 31/12/2006, 12h35
  4. Réponses: 2
    Dernier message: 17/08/2006, 12h36
  5. limite du nombre de caractères dans une requete
    Par pheno82 dans le forum Access
    Réponses: 3
    Dernier message: 01/06/2006, 22h12

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