Requête SQL dans Oracle

Bonjour,

J'ai besoin d'aide pour écrire une requête pour avoir les noms des tables dans ma BDD Oracle

Conditions :
- Les tables doivent avoir un champ appelé user_id .
- Les tables doivent avoir au moins une ligne avec la valeur user_id=1000.

Merci d'avance
Configuration: Windows XP
Firefox 3.0.17

12 réponses

  1. Merci toutes les réponses,

    On a résolu le problème en [PL/SQL]. On n'a pas pu tester les requêtes SQL car je suis présentement en formation hors du bureau. On va le tester dès mon retour et vous donner des nouvelles.

    Merci!
    0
    1. C'est clair.....vu que le resultat est dynamique (depend du resultat des nom des tables...ca complique l'affaire....)
      Mais bon y'a toujours des solutions, plus ou moins simple...!!;)))
      @+
      0
      1. Ben ... je crains que je n'ai pas trouvé une solution simple.
        Voilà le meilleur que j'ai pu faire pour éviter le PL/SQL :

        On passe par une table de travail dans laquelle on insère en fait ce que l'on avait avant dans le spool.
        Puisque maintenant on possède une table, on peut alors sélectionner des informations.
        Voilà pour le principe.

        Le code :
          DROP TABLE tabTest;
          CREATE TABLE tabTest(col1 VARCHAR2(1000) );
          -- Generer les ordres SELECT sur chaque table qui possede une colonne ID
          --   et insertion de celles-ci dans tabTest
          INSERT INTO tabTest(col1)
             SELECT 'SELECT '||table_name||' FROM '||table_name
                                                          ||' WHERE id=1000;  '
               FROM  user_tab_columns
               WHERE UPPER(column_name) = 'ID';
          -- Liste des tables concernées
          SELECT SUBSTR(col1, instr(col1, ' ', 1, 1), instr(col1, ' ', 1, 2)-instr(col1, ' ', 1, 1))
            FROM tabTest;
        


        Pas vraiment simple mais je ne suis pas sûr que l'on peut faire autrement sans passer par un langage de programmation.
        0
        1. SET ESCAPE \
          SPOOL c:\userid1000.SQL
          SET echo OFF
          SET HEADING OFF
          SELECT 'select tabl from(SELECT count(*),\'''||table_name||'\'' as tabl FROM '||table_name||' WHERE id=1000 having count(*)>0);'
          FROM user_tab_columns
          WHERE UPPER(column_name) = 'ID';
          spool ON
          SPOOL OFF
          SET HEADING ON
          @c:\userid1000.SQL
          ca devrait le faire....
          Mais je prend aussi si t'as un truc avec decode!!
          @+
          0
          1. je regarde avec si avec un DECODE on peut s'en sortir ...

            A+ (environ 1/2 heure ...)
            0
            1. Salut,
              je pense qu'un truc du style fonctionnerait:
              SPOOL c:\userid1000.SQL
              SELECT 'SELECT count(*),'||table_name||' as tabl FROM '||table_name||' WHERE id=1000 having count(*)>0;'
              FROM user_tab_columns
              WHERE UPPER(column_name) = 'ID';
              SPOOL OFF;
              Mais y'a un probleme..car il faudrait que le premier table_name garde la variable du nom de table mais avec des ' autours...t'aurait pas une soluce BadGuitarist??Car pour le coup cela serait plus simple!!
              0
              1. Bonjour,
                Ah ... désolé ... effectivement, cela change pas mal les choses ;-)
                0
                1. Salut,
                  Je suis d'accord avec toi...mais pour le coup tu obtiens les lignes concernées et non le nom des tables concernées
                  J'ai besoin d'aide pour écrire une requête pour avoir les noms des tables
                  ou je fais fausse route.......
                  Mais je verai bien un script du style (en utilisant une table temporaire....)
                  CREATE GLOBAL TEMPORARY TABLE RESTEMP (
                  resultat VARCHAR(64)
                  ) ON COMMIT DELETE ROWS; 
                  

                  Et le script
                  DECLARE 
                  CURSOR c1 IS SELECT table_name FROM user_tab_columns WHERE column_name='USER_ID';
                  tabl VARCHAR(64);
                  res INTEGER;
                  requete VARCHAR(128);
                  BEGIN
                  OPEN c1;
                  FETCH c1 INTO tabl;
                  WHILE c1%FOUND LOOP
                  	requete:='select count(*) from '||tabl||' where user_id>=1000';
                  	EXECUTE IMMEDIATE requete INTO res;
                  	IF (res>0) THEN
                  	   INSERT INTO RESTEMP VALUES (tabl);
                  	END IF;
                          FETCH c1 INTO tabl;
                  END LOOP;
                  CLOSE c1;
                  END;
                  /
                  SELECT * FROM RESTEMP;
                  COMMIT;
                  
                  0
                  1. Bonsoir morsli_laloute et Chuka,

                    Merci Chuka mais tu n'étais pas loin de la solution en SQL :
                    en effet, sans passer par PL/SQL, tu peux générer un script que tu lanceras pour obtenir ta réponse :

                    Sous sqlplus, tu tapes cela :

                    SPOOL c:\userid1000.sql
                    SELECT    'SELECT * FROM '||table_name
                                ||' WHERE user_id=1000; '
                      FROM  user_tab_columns
                      WHERE UPPER(column_name) = 'USER_ID';
                    SPOOL OFF
                    @c:\userid1000.sql
                    


                    et ça devrait le faire en utilisant que du SQL ;-)
                    0
                    1. Salut,
                      voila une petite solution qui peut t'aider..enfin j'espere!!;)
                      DECLARE 
                      CURSOR c1 IS SELECT table_name FROM user_tab_columns WHERE column_name='user_id';
                      tabl VARCHAR(64);
                      BEGIN
                      OPEN c1;
                      FETCH c1 INTO tabl;
                      WHILE c1%FOUND LOOP
                      	DECLARE
                      	res INTEGER;
                      	requete VARCHAR(128):='select count(*) from '||tabl||' where id>=1000';
                      	BEGIN
                      	EXECUTE IMMEDIATE requete INTO res;
                      	IF (res>0) THEN
                      	   DBMS_OUTPUT.PUT_LINE(tabl);
                      	END IF;
                      	END;
                      FETCH c1 INTO tabl;
                      END LOOP;
                      CLOSE c1;
                      END;
                      

                      @+
                      0
                      1. Merci pour la réponse,

                        Si on ne peut pas le faire par une req SQL, quelles la syntaxe en PL/SQL, (je suis nouveau en Oracle).
                        Merci!
                        0
                        1. j'ai bien peur que sois obligé de passer par du PL/SQL pour répondre au 2 conditions...
                          0