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 :

Contrôle du dernier caractère de colonnes dans plusieurs tables.


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Décisionnel Junior
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Décisionnel Junior

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut Contrôle du dernier caractère de colonnes dans plusieurs tables.
    Bonjour,


    Je dois créer une requête SQL et je ne trouve pas la solution.

    Le but est de savoir si le dernier caractère des données des colonnes VILLE, RUE et REGION est un A.
    Le problème c'est que les colonnes VILLE, RUE et REGION sont présentes dans potentiellement plusieurs tables dans mon application CHAUSSURES.

    J'ai accès à une table de référence dans ma base de données qui contient le nom des tables contenant les colonnes VILLE, RUE et REGION mais cette table peut être amené à évoluer avec le temps mais elle conserve la forme de :
    Nom_Table // Nom_Colonne
    TABLE_A // VILLE
    TABLE_A // RUE
    TABLE_B // VILLE
    TABLE_B // REGION
    etc

    Je pensais donc utiliser un CURSOR pour générer dans une variable l'ensemble des tables et des colonnes sur lesquelles la requête va se baser ce qui donnerait un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       CURSOR curseur IS
      SELECT regexp_substr(
        (SELECT Nom_Colonne FROM &P_E_C_Table_Param. WHERE NOM_TABLE = '&P_E_C_Table_Param.'),'[^, ]+', 1, LEVEL) FROM dual
      CONNECT BY regexp_substr(
        (SELECT Nom_Colonne FROM &P_E_C_Table_Param. WHERE NOM_TABLE = '&P_E_C_Table_Param.'), '[^, ]+', 1, LEVEL) IS NOT NULL;
    Mais je n'arrive pas à faire appliquer la requête sur l'ensemble des colonnes VILLE, RUE et REGION de mon application CHAUSSURES. Je ne trouve pas la syntaxe adéquate en SQL :/
    La requête devrait me sortir 0 si le dernier caractère des colonnes sélectionnées est un A et 1 si c'est autre chose.


    Merci de votre aide ^^'

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 613
    Billets dans le blog
    10
    Par défaut
    Citation Envoyé par KingArthur Voir le message
    Le but est de savoir si le dernier caractère des données des colonnes VILLE, RUE et REGION est un A.
    C'est assez curieux comme besoin, pouvez vous préciser le contexte pour éclairer notre lanterne


    Citation Envoyé par KingArthur Voir le message
    Le problème c'est que les colonnes VILLE, RUE et REGION sont présentes dans potentiellement plusieurs tables dans mon application CHAUSSURES.
    Le plus souvent, c'est symptomatique d'une modélisation hasardeuse, et qui dit modélisation compliquée, dit requête alambiquée et couteuse.
    Mais bon il faut faire avec sauf si vous pouvez corriger la modélisation, qu'en est il ?


    Citation Envoyé par KingArthur Voir le message
    J'ai accès à une table de référence dans ma base de données qui contient le nom des tables contenant les colonnes VILLE, RUE et REGION mais cette table peut être amené à évoluer avec le temps mais elle conserve la forme de
    Tout SGBD-R possède un catalogue dans lequel on trouve notamment la liste des colonnes de chaque table. J'espère que vous n'avez pas réinventé la roue en dupliquant les informations du catalogue
    Sous réserve que le même contenu fonctionnel possède toujours le même nom de colonne, une simple interrogation du catalogue permet de connaitre les tables concernées.

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    J'avoue ne pas avoir bien compris le code donné. C'est un curseur pour récupérer des noms de table ?
    Rien à voir donc avec la demande de rechercher les villes finissant par A

    Quel est le but ?

    Si c'est un script, c'est faisable avec EXECUTE IMMEDIATE car le nom de table ne peut pas être utilisé en tant que paramètre d'un SELECT
    Si c'est un SELECT, tu peux t'en sortir avec une fonction PIPELINED, toujours avec de l'EXECUTE IMMEDIATE.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Développeur Décisionnel Junior
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Décisionnel Junior

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut
    Pour le contexte :

    Les personnes avec qui je travaille ont créé un script de redressement de données sur une application TOTO.
    Je dois créer un outil qui permet de vérifier que les données ont bien été redressé comme prévu. Pour cela, le dernier caractère de certaines colonnes de certaines tables doit désormais être un "A".


    Ce qui fait que je me retrouve avec plusieurs tables et parfois les colonnes VILLE, RUE et REGION (par exemple) sont présentes dans plusieurs tables...
    Puisque j'ai plusieurs milliers de table, ça fait un sacré paquet de colonnes...
    Et cette modélisation est intouchable.

    Donc l'idée est de pouvoir cibler facilement les tables contenant les colonnes que je cherche afin de vérifier le dernier caractère toujours avec 0 si c'est OK, 1 si c'est pas le cas afin que les autres personnes puissent aller regarder pourquoi dans la table BIDULE dans la colonne VILLE à la ligne 846 le dernier caractère n'est pas devenu un A.


    Je veux extraire idéalement les lignes qui n'auraient pas le bon dernier caractère avec la colonne et la table où elles sont situées dans la base de données. Si je n'extrais aucune ligne c'est que tout est OK.

    La table REFERENCE contient plusieurs informations dont le nom des tables avec les colonnes qui ont été modifié. Je vois cette table comme les coordonnées des données que je dois contrôler pour gagner en performance.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 613
    Billets dans le blog
    10
    Par défaut
    En ce cas le SQL dynamique semble en effet la seule solution sauf que
    - le choix d'ajouter un 'A' comme critère de traçage pénalise bigrement le suivi et les perfs
    - comment fairez vous la distinction entre un 'A' ajouté et un 'A' qui pré-existait avant redressement des données (par exemple la rue d'Alésia)

    Une autre démarche eût été de dupliquer les données sur une table de travail pourvue de colonne(s) supplémentaire(s) permettant de distinguer facilement les lignes modifiées de celles inchangées

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Développeur Décisionnel Junior
    Inscrit en
    Décembre 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Décisionnel Junior

    Informations forums :
    Inscription : Décembre 2018
    Messages : 7
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    En ce cas le SQL dynamique semble en effet la seule solution sauf que
    - le choix d'ajouter un 'A' comme critère de traçage pénalise bigrement le suivi et les perfs
    C'est malheureusement une contrainte obligatoire...

    - comment fairez vous la distinction entre un 'A' ajouté et un 'A' qui pré-existait avant redressement des données (par exemple la rue d'Alésia)
    Les données pré-redressement ne comportent pas de A en dernier caractère, donc pas de problème à ce niveau-là.

    Une autre démarche eût été de dupliquer les données sur une table de travail pourvue de colonne(s) supplémentaire(s) permettant de distinguer facilement les lignes modifiées de celles inchangées
    La création d'une table temporaire pour effectuer le contrôle est possible avec un échantillon (disons 100 000 lignes par exemple) du moment que je peux garder une trace des lignes en erreur sur un fichier text.

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    Le problème est de trouver le N° de ligne 385.
    Ca va être plus complexe (pas impossible, mais complexe) car il faut alors aller chercher la PK de chaque table afin de l'indiquer


    Déjà voici un exemple qui permet de compter le nombre de lignes par table de l'utilisateur connecté contenant la colonne VILLE, dont un champ VILLE finit par un "A", et d'afficher les tables qui en ont au moins une (avec le nombre)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
    	v_ NUMBER;
    BEGIN
    FOR r IN (
    SELECT table_name FROM user_tab_columns c WHERE column_name = 'VILLE'
    AND NOT EXISTS (SELECT 1 FROM user_views v WHERE v.view_name = c.table_name) -- Pas les Vues
    AND NOT EXISTS (SELECT 1 FROM user_snapshots v WHERE v.table_name = c.table_name) -- Pas les Vues Matérialisées
    )
    LOOP
    	EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '|| r.table_name ||' WHERE ville LIKE ''%A''' INTO v;
      IF v > 0 THEN DBMS_OUTPUT.PUT_LINE(r.table_name || CHR(9) || v); END IF;
    END LOOP;
    END;
    Si tu veux afficher les lignes, tu peux aussi générer un script sqlplus afin de spooler
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    DECLARE
    	v_ NUMBER;
    BEGIN
    FOR r IN (
    SELECT table_name FROM user_tab_columns c WHERE column_name = 'VILLE'
    AND NOT EXISTS (SELECT 1 FROM user_views v WHERE v.view_name = c.table_name) -- Pas les Vues
    AND NOT EXISTS (SELECT 1 FROM user_snapshots v WHERE v.table_name = c.table_name) -- Pas les Vues Matérialisées
    )
    LOOP
    	EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '|| r.table_name ||' WHERE ville LIKE ''%A''' INTO v;
      IF v > 0 THEN DBMS_OUTPUT.PUT_LINE( 'SELECT * FROM '|| r.table_name ||' WHERE ville LIKE ''%A'';'); END IF;
    END LOOP;
    END;
    Ensuite le résultat du DBMS, tu l'exécutes dans sqlplus après avoir fait un spool

Discussions similaires

  1. [2014] Somme d'une colonne dans plusieurs tables
    Par Massigne dans le forum Développement
    Réponses: 11
    Dernier message: 24/03/2017, 11h10
  2. Ajouter une colonne dans plusieurs tables a la fois
    Par NicaeaCivitas dans le forum Développement
    Réponses: 2
    Dernier message: 15/06/2011, 10h38
  3. Réponses: 9
    Dernier message: 08/01/2008, 13h58
  4. Remplacé des caractères UTF8 erronés dans plusieurs fichiers
    Par evaisse dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 31/03/2007, 23h18
  5. Réponses: 5
    Dernier message: 27/12/2006, 16h56

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