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

WinDev Discussion :

UPDATE sur base oracle avec Hexecuterequetesql


Sujet :

WinDev

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut UPDATE sur base oracle avec Hexecuterequetesql
    Bonjour a tous,

    encore un petit souci. J'ai un programme WinDev qui génère un code SQL à injecter dans une base oracle. Le code, si je le lance directement sur le serveur oracle fonctionne. Passé au travers du HExecuterequeteSQL avec option Hrequetesanscorrection ne fonctionne pas et me dit caractère invalide.
    Le code SQL à passer est le suivant:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    UPDATE table1
    set QUANTITE = QUANTITE -
    case
    when T_PRODUIT_ID = '2395' then 1
    else 0
    end;
    UPDATE table2
    SET QTE = QTE +
    case
    when T_PRODUIT_ID = '2395' AND ANNEE = '2018' AND MOIS = '10' then 1
    else 0
    end;

    EN fait, il ne veut pas du caractère ; à la fin de chaque commande update (qui permet d’enchaîner plusieurs update en une seule injection). Si je ne mets pas ce caractère ;, bien évidemment, c'est oracle qui couine alors.
    Est-ce que quelqu'un a une idée. Pour info, j'ai essayé un tout simple Update/set/where qui du coup ne requiert pas de ; et l'update fonctionne sans erreur. Ma liaison avec la base fonctionne donc sans souci.

    Ah et pour ceux qui trouveraient le code bien lourd pour seulement un seul when t_produit_id, en fait c'est juste pour le test que je met un seul produit_id, en vrai, le code est comme cela:

    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
    UPDATE table1
    set QUANTITE = QUANTITE -
    case
    when T_PRODUIT_ID = 'aaaa' then 1
    when T_PRODUIT_ID = 'bbbb' then 2
    when T_PRODUIT_ID = 'cccc' then 8
    when T_PRODUIT_ID = 'dddd' then 4
    when T_PRODUIT_ID = 'eeee' then 5
    ….
    else 0
    end;
    UPDATE table2
    SET QTE = QTE +
    case
    when T_PRODUIT_ID = 'aaaa' AND ANNEE = '2018' AND MOIS = '10' then 2
    when T_PRODUIT_ID = 'bbbb' AND ANNEE = '2018' AND MOIS = '10' then 4
    when T_PRODUIT_ID = 'cccc' AND ANNEE = '2018' AND MOIS = '10' then 6
    when T_PRODUIT_ID = 'dddd' AND ANNEE = '2018' AND MOIS = '10' then 8
    ….
    else 0
    end;

    Merci a tous pour vos lumières

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Pour moi hExecuteRequeteSql ne permet de lancer qu'une seule requête à la fois, or ici tu tentes d'en lancer 2. D'où l'erreur.
    Je ne vois pas d'autres solution que de lancer les deux requêtes séparément.

    Tatayo.

  3. #3
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 049
    Points : 9 384
    Points
    9 384
    Par défaut
    Je pensais exactement comme Tatayo, mais je viens de tenter un truc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    sch = [
    begin 
    update table1 set col1 = 0 ;
    update table2 set col2 = 1 ; 
    end ;
    ]
    hexecuterequetesql( maSourcedeDonnees,  maConnexion, hrequetesansCorrection,  sch)
    Et ça marche. (base de données Oracle 12)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 70
    Points : 26
    Points
    26
    Par défaut
    Après bien des essais, j’en suis arrivé à réécrire une bonne partie de mon code afin de faire des requêtes séparées.
    Ça m’a fait du boulot mais à l’inverse, l’execution,est plus rapide. Un case/when/else sur une table de 300000 lignes c’est lent. Un update /set/where même 10 fois de suite c’est quasi instantané...

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

Discussions similaires

  1. update sur base avec trois jointures
    Par valter25 dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/08/2009, 15h23
  2. [Oracle] Update sur 1 colonne avec condition existence (SUBSTR)
    Par magic charly dans le forum Langage SQL
    Réponses: 6
    Dernier message: 20/04/2006, 13h57
  3. Réponses: 3
    Dernier message: 21/06/2005, 10h23
  4. Problleme de connection ADO sur base Oracle
    Par poirier dans le forum ASP
    Réponses: 7
    Dernier message: 08/06/2004, 09h34
  5. Réponses: 3
    Dernier message: 17/05/2004, 17h28

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