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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    octobre 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2013
    Messages : 46
    Points : 17
    Points
    17

    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
    Homme Profil pro
    Responsable Datas
    Inscrit en
    janvier 2009
    Messages
    3 554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Datas

    Informations forums :
    Inscription : janvier 2009
    Messages : 3 554
    Points : 7 762
    Points
    7 762

    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
    2 110
    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 : 2 110
    Points : 4 412
    Points
    4 412

    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
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    octobre 2013
    Messages
    46
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : octobre 2013
    Messages : 46
    Points : 17
    Points
    17

    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, 16h23
  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, 14h57
  3. Réponses: 3
    Dernier message: 21/06/2005, 11h23
  4. Problleme de connection ADO sur base Oracle
    Par poirier dans le forum ASP
    Réponses: 7
    Dernier message: 08/06/2004, 10h34
  5. Réponses: 3
    Dernier message: 17/05/2004, 18h28

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