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 :

Stocker une requête update dans une table


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 39
    Points
    39
    Par défaut Stocker une requête update dans une table
    Bonjour,
    J'ai un petit souci si vous pouvez me donner des idées.
    Je dois mettre à jour une table via une autre table qui contient des règles de transcodification.

    Exemple :
    table A (aa, cd_aa)

    table_transco ( bb, table_name, col_name, ancienValue, NewValue)
    jeux de données ;

    table A
    90, 0
    88, 2
    table_transco
    88, A, cd_aa, 2, 2
    90, A, cd_aa, 0, 3

    Je dois mettre à jour la valeur 0 du champ cd_aa avec la nouvelle valeur qui est 3.

    Je l'ai fait avec une proc stockée et ça marche.
    Le problème c'est qu'on me demande de stocker la requête qui fait l'update dans une table (est-ce que c'est une nouvelle table ou un champ de la table "table_transco" ?) et gérer cet "update" dynamiquement.

    Si vous avez des idées n'hésitez pas à m'en faire part.

    Merci beaucoup

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    WITH table_transco AS (SELECT 88 bb, 'A' table_name, 'cd_aa' col_name, 2 ancienValue, 2 NewValue FROM dual
    UNION ALL SELECT 90, 'A', 'cd_aa', 0, 3 FROM dual
    )
    SELECT bb, table_name, col_name, ancienvalue, newvalue, 
    			DECODE(ancienvalue, newvalue, '', 'UPDATE '|| table_name ||' set '|| col_name ||'='|| newvalue ||' WHERE '|| col_name ||'='|| ancienvalue) AS req_Update
    FROM table_transco
     
     
    BB	TABLE_NAME	COL_NAME	ANCIENVALUE	NEWVALUE	REQ_UPDATE
    88	A	cd_aa	2	2	
    90	A	cd_aa	0	3	UPDATE A set cd_aa=3 WHERE cd_aa=0
    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 expérimenté

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Points : 1 359
    Points
    1 359
    Par défaut
    Je l'ai fait avec une proc stockée et ça marche.
    Le pb c'est qu'on me demande de stocker la requet qui fait l'update dans une table (est ce que c'est une nouvelle table ou un champ de la table "table_transco" ?) et gerer ce "update" dynamiquement.

    Si vous avez des idées n'hésiter pas à m'en faire part.

    Merci bcp
    Bonjour,

    En utilisant une procédure stockée (static PL/SL) pour faire votre update vous être protégé parce que:

    (1) Vous allez utiliser les bind variables automatiquement (PL/SQL statique)
    (2) Vous n’êtes pas sujet à la menace du ‘’SQL injection’’
    (3) Vous êtes sûr de la compilation de votre package dès sa création

    En stockant l’update dans une table, vous allez devoir utiliser du sql dynamique pour exécuter votre update ; ainsi vous devez :

    (1) faire un effort supplémentaire pour l’utilisation des bind variables
    (2) vous êtes à la merci du ‘SQL injection’
    (3) votre code n’est parsé qu’au moment de son exécution, et il se pourrait qu’il ne compile pas lors de cette exécution

    Bien à vous

    Mohamed Houri
    Bien Respectueusement
    www.hourim.wordpress.com

    "Ce qui se conçoit bien s'énonce clairement"

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 39
    Points
    39
    Par défaut
    Merci pour vos réponses.
    La requete de McM a bien marché, sauf qu'elle me remplit la table "table_transco" qu'avec les lignes où il y a bien eu un changement sur la liste des valeurs.
    Dans mon cas
    j'ai bien eu:

    BB TABLE_NAME COL_NAME ANCIENVALUE NEWVALUE REQ_UPDATE
    88 A cd_aa 2 2
    90 A cd_aa 0 3 UPDATE A SET cd_aa=3 WHERE cd_aa=0

    Je pense que je ne dois avoir dans cette table que les lignes où j'aurai la requête ?? je ne suis pas encore sûr.

    Ensuite j'utilise dans talend un composant input où je mets une requête sur cette table "table_transco" qui me renvoie TABLE_NAME, REQ_UPDATE
    puis un autre composant qui exécute cette requête sur la base.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 67
    Points : 39
    Points
    39
    Par défaut
    J'ai une autre problématique :
    j'ai une trable transformation qui a la structure suivante :
    (cle1, ordre, NomTable, requete)
    cette requete contient une règle sur un champ de "NomTable".

    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update NomTable set NomTable.colonne = '122' where NomTable.cle2 ='20'
    Comment je pourrai insérer cette ligne "requete update" dans le champ "requete" de ma table "transformation" ??

    Ce cas est différent du cas ci-dessus, je n'arrive pas à utiliser decode pour le faire.

    Merci pour votre aide.

Discussions similaires

  1. [2012] Exécution d'une requête UPDATE dans une variable
    Par Fritzoune dans le forum Développement
    Réponses: 3
    Dernier message: 24/10/2014, 13h42
  2. [AC-2007] Sous-requête "Select" dans une requête "update"
    Par MatAllwhite dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 27/06/2013, 14h00
  3. erreur dans une requête sql dans une fonction php
    Par frboyer dans le forum Langage
    Réponses: 3
    Dernier message: 07/04/2009, 13h37
  4. [MySQL] Exécuter une requête UPDATE dans une boucle
    Par vacknov dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 24/10/2008, 17h46
  5. [Requête] Utilisation d'une fonction perso dans une requête
    Par Julien Dufour dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 16/03/2007, 09h53

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