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

SQL Oracle Discussion :

sql ou pl sql


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut sql ou pl sql
    Bonjour a tous
    j'ai un soucis que je ne sais resoudre...
    Je vous soumet le topo.

    Il s'agit d'une base oracle 9i. Avec un seul schema.
    Dans ce schema il y a environ 1500 objets...tables, view etc...
    On gere 6 application web differentes avec tous ces objets.
    Chaque appli est gerées par un developpeur.

    Chaque developpeur va me filer des requetes qui sont des count(*) et donc qui retournent une valeur. On me demande de regrouper toutes les requetes de tous les developpeurs en use seule et de presenter les données comme suit:

    CHOSE VALEUR
    ST 2122
    CF 5400

    etc...
    Le probleme c'est que le contenu de CHOSE n'existe pas dans la base,. c'est des nom que je dois ajouter dans la requete pour que ca sorte comme dans l'exemple. L'objectif final etant que le client prenne l'output et l'importe dans excel.
    Les requetes des developpeurs ne sont pas de simple select count(*)...mais des trucs plus compliqués avec des inner join etc...
    J'ai pensé faire ca en PL/SQL car l'on peut stocker la valeur de chaque requete dans une variable et ensuite creer le tableau...mais alors j'ai aucune idée de comment le faire...ni la sintaxe.
    Qq'un peu me mettre sur la voie?
    meme du pseudo code ca pourrait m'aider pour demarrer.
    J'ai essayé avec ceci:

    select 'CT' as CHOSE, count(*) as VALEUR from table1
    UNION ALL
    select 'CF', count(*) from table2;

    ca marche mais je ne sait pas comment remplacer le simple count(*) par les reauetes compliquées des developpeurs,


    D'avance merci

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Le plus simple si vous devez exécutez les requêtes des développeurs c'est de rajouter la valeur CHOSE dans leur requête et de faire un union all.

    Si les requêtes de vos développeurs sont :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select count(*) from table1 t1 inner join table2 t2 on t2.id = t1.id
    select count(*) from table3 t3 inner join table4 t4 on t4.id = t3.id
    Vous obtiendrez alors la requête unique :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select 'ST' as CHOSE, count(*) as VALEUR from table1 t1 inner join table2 t2 on t2.id = t1.id
    UNION ALL
    select 'CF', count(*) from table3 t3 inner join table4 t4 on t4.id = t3.id

  3. #3
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Est-ce que ça vaut le coup de lancer X COUNT(*), potentiellement plusieurs centaines avec 1500 'objets' en BDD, pour que chaque développeur n'en utilise que 1 ou deux à afficher à la fois ?

    Une simple requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(*) FROM LaTableA
    sera plus rapide à faire exécuter à la demande plustôt que cette usine à gaz !
    D'autant plus que si la requête revient souvent, le SGBD se sert de ses statistiques et ne réexécute pas la requête si elle est encore en mémoire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut sql ou pl / sql
    Salut a tous
    d'abord merci de vos reponses, ensuite pour repondre a la derniere question:
    Je suis ok avec toi, des count(*) repetés c'est pas trop cool. Mais cette requete sera faite que une seule fois, pour generer le rapport et ensuite plus.
    Si ca devait se generaliser... quel type de code tu ferais?
    S'ils veulent la quantité de lignes de chaque tables et en une seul requete, existe t'il un moyen de faire plus clean?
    D'avance merci

  5. #5
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Regarde dans la BDD information_schema.
    Sous MySQL il y a dedans une table appelée TABLES qui comporte une colonne TABLE_ROWS laquelle contient le nombre de lignes de la table.

    Dès lors pour obtenir le nombre de lignes de toutes les tables tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT TABLE_SCHEMA, TABLE_NAME, TABLE_ROWS
    FROM information_schema.TABLES
    ORDER BY TABLE_SCHEMA, TABLE_NAME
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut sql ou pl/sql
    Salut
    Et ca marche aussi avec ORACLE? je suis sous oracle 9i.
    Tiens regarde j'au trouvé ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select rownum, numproduct, descproduct
    from 
      T_PRODUCTOS
    where
      numproduct>100
    Ca incremente de 1 rownum chaque fois que ca match avec la requete...Je vais faire un action plan des 2 requetes pour coir celle qui consomme le moins de ressources.
    Et je filerais les resultats ici.
    Merci encore

  7. #7
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    J'ai du mal à vous suivre, quel est le rapport entre rownum et le besoin initial ?

    Avez-vous essayé ce que je vous ai suggéré dans le deuxième post ?

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2006
    Messages
    702
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 702
    Par défaut sql ou pl/sql
    Bonjour
    oui j'ai essayé , ca marche super bien, le resultat est exactement ce que je voulais. Seulement que je regardais l'impacte de faire des count(*) comme ca a ete souligné au 3 eme post...
    Le row num ca colle pas, le resultat du select est une liste de une ligne par enregistrement, donc ca va pas. Je retiendrais ta formule.
    Merci encore

  9. #9
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 814
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Et ca marche aussi avec ORACLE? je suis sous oracle 9i.
    Je ne connais pas (encore) Oracle mais information_schema fait partie de la norme SQL je crois donc un SGBD réputé comme Oracle devrait l'avoir implanté.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par ldiaz Voir le message
    Seulement que je regardais l'impacte de faire des count(*) comme ca a ete souligné au 3 eme post...
    Oui de toutes façons il faut bien les compter ces lignes !

    Citation Envoyé par CinePhil Voir le message
    donc un SGBD réputé comme Oracle devrait l'avoir implanté.
    Négatif, Oracle utilise des vues all_tables, all_tab_columns...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  2. [PL/SQL] Optimisation requete SQL
    Par CDRIK dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/10/2004, 09h52
  3. Catproc.sql et Catalog.sql
    Par blids dans le forum Administration
    Réponses: 26
    Dernier message: 26/04/2004, 17h52
  4. Problème réplication SQL Server et SQL Server CE (RDA)
    Par didix11 dans le forum Réplications
    Réponses: 2
    Dernier message: 15/04/2004, 11h10
  5. de SQL vers T-SQL sous MS SREVER
    Par Nadaa dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 19/09/2003, 15h37

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