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. j'ai bien peur que sois obligé de passer par du PL/SQL pour répondre au 2 conditions...
    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. 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. 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,
            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. Bonjour,
              Ah ... désolé ... effectivement, cela change pas mal les choses ;-)
              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. je regarde avec si avec un DECODE on peut s'en sortir ...

                  A+ (environ 1/2 heure ...)
                  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. 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. 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. 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