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 :

Convertir chaîne de caractères en code interprété


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut Convertir chaîne de caractères en code interprété
    Bonjour, J'ai un problème dont l'énoncé est un peu long, mais je tente quand même. Merci de votre aide.

    J'ai plusieurs tables, par exemple :
    table app_toto, colonnes : intdate char(8), inttime char(5), formula varchar(99), result NUMBER, resdate DATE, zyxw NUMBER, vutsr NUMBER, ...
    table app_titi, colonnes intdate char(8), inttime char(5), formula varchar(99), result NUMBER, resdate DATE, abcd NUMBER, efgh NUMBER, ijkl NUMBER, ...
    table app_...
    Le nombre de tables app_% dans un même schéma n'est pas connu à l'avance.
    Pour chacune de ces tables, les 5 premières colonnes (intdate, inttime, formula, result, resdate) sont toujours là.
    Les autres ne sont pas connues à l'avance, ni leur nom, ni leur nombre.

    Pour chaque ligne, le champ formula de la table app_toto contient une formule du style "zyxw + vutsr" ou "zyxw * vutsr". Cette formule peut changer suivant les lignes,
    mais il s'agit toujours d'une formule qui est fonction des colonnes.
    De même, pour chaque ligne de la table app_titi, le champ formula contient une formule du style "if (abcd + efgh) * ijkl >= 95% then 100%", dans un langage à trouver.
    Chaque table a un état avant traitement puis un état après traitement, le but étant d'écrire ce qu'il faut pour réaliser ce traitement.

    J'ai donc besoin d'aide pour écrire une ou plusieurs procédure(s) et/ou fonction(s) qui permette(nt) à un curseur se baladant
    d'une ligne à une autre (donc d'une date à une autre) pour chaque table, d'évaluer la formule en fonction des colonnes et
    d'inscrire le résultat dans le champ result et d'inscrire dans le champ resdate la date à laquelle le calcul est fait (sysdate).
    Il s'agit donc de convertir une chaîne de caractères en code interprété ! (en évitant de développer un langage, donc en considérant que
    la chaîne de caractères est directement interprétable)

    Exemple :
    Table APP_TOTO avant traitement :
    INTDATE | INTTIME | FORMULA | RESULT | RESDATE | zyxw | vutsr | ...
    09/02/19 | 1400 | "zyxw + vutsr" | NULL | NULL | 1 | 1 |
    09/02/19 | 1500 | "zyxw + vutsr" | NULL | NULL | 1 | 0 |
    09/02/19 | 1600 | "zyxw * vutsr" | NULL | NULL | 1 | 0 |
    09/02/19 | 1700 | "zyxw * vutsr" | NULL | NULL | 1 | 1 |
    ...

    table APP_TOTO après traitement
    INTDATE | INTTIME | FORMULA | RESULT | RESDATE | zyxw | vutsr | ...
    09/02/19 | 1400 | "zyxw + vutsr" | 2 | 20.02.2009 14:05:10 | 1 | 1 |
    09/02/19 | 1500 | "zyxw + vutsr" | 1 | 20.02.2009 14:05:10 | 1 | 0 |
    09/02/19 | 1600 | "zyxw * vutsr" | 0 | 20.02.2009 14:05:10 | 1 | 0 |
    09/02/19 | 1700 | "zyxw * vutsr" | 1 | 20.02.2009 14:05:10 | 1 | 1 |
    ...


    Les formules peuvent être de différents types :
    "zyxw + vutsr"
    "if (abcd + efgh) * ijkl >= 95% then 100%"
    "max (zyxw, vutsr)"
    et elles sont toujours fonction des colonnes.

    L'exercice, plus complexe en réalité, voudrait que le champ formula contienne un identifiant
    qui "pointe" sur une formule dans une autre table.
    Si quelqu'un a compris cette pseudo spécification, arriverait-il à me proposer quelque chose ?
    Ou quelque chose qui n'a rien à voir mais qui permet le traitement de façon générique.
    Si impossible, en perl, ça me va aussi...

    Merci beaucoup !

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (abcd + efgh) * ijkl >= 95% then 100%


    Aucun language ne saurait évaluer que 10 + 20 > 80% ?
    80% de quoi ???
    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

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2009
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 119
    Points : 114
    Points
    114
    Par défaut
    Bonjour,
    je peux t'aider d'abord pour les formules de type "zyxw + vutsr", "zyxw * vutsr"... ==> tu fais une procédure ou fonction qui renvoi les noms des colonnes à utiliser dans la formule.

  4. #4
    Membre confirmé

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    507
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 507
    Points : 503
    Points
    503
    Par défaut
    Si les formules se limitent à des foncions mathématiques, cela est possible. Tu récupères la formule dans une chaîne, avec un EXECUTE IMMEDIATE ensuite.

    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
    DECLARE
      ma_formule VARCHAR2(50);
      mon_id NUMBER;
      ma_requete VARCHAR2(200);
      mon_resultat NUMBER;
    BEGIN
      SELECT formula, id INTO ma_formule, mon_id
        FROM APP_TOTO
       WHERE (condition);
     
      ma_requete := 'SELECT '||ma_formule||' FROM APP_TOTO';
      EXECUTE IMMEDIATE ma_requete INTO mon_resultat;
     
      UPDATE APP_TOTO
         SET result = mon_resultat
       WHERE id = mon_id;
      COMMIT;
    END;
    Si la formule contient autre chose qu'une opération, je ne vois comment faire (et pas sûr que ce soit faisable).

  5. #5
    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
    La formule peut inclure des tests:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    DECLARE
      v VARCHAR2(200) := 'select case when (10 + 10) * 4 >= 80 then 100 else 0 end  from dual';
      r NUMBER ;
    BEGIN
      EXECUTE IMMEDIATE v INTO r ;
      DBMS_OUTPUT.PUT_LINE('result:' || r);
    END;
    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

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2009
    Messages : 22
    Points : 10
    Points
    10
    Par défaut
    Bonjour,
    Merci pour ces promptes réponses. Il y a de l'idée car ça ressemble à ce que mon intuition me dictait. Je vais essayer ça courant semaine prochaine, je vous tiendrai au courant.
    Je garde donc en tête qu'une proposition marche bien si on s'impose comme langage une formule mathématique. Mais la seconde complète bien dans des cas où ce n'est pas mathématique, ce qui sera très peu le cas, donc c'est jouable pour moi.
    le 95% ou le 100% était un façon de retourner 0,95 ou 1... Je l'ai mis à titre d'exemple.

    Vraiment merci.

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

Discussions similaires

  1. Convertir chaîne de caractères en réel
    Par minooo dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 21/01/2013, 21h25
  2. Convertir int en chaîne de caractère
    Par be_tnt dans le forum Réseau
    Réponses: 44
    Dernier message: 25/04/2006, 15h35
  3. Convertir des caractères en code Morse
    Par programation dans le forum C++
    Réponses: 3
    Dernier message: 04/02/2006, 00h08
  4. Réponses: 2
    Dernier message: 18/10/2003, 14h42

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