Requête SQL dans Oracle

Fermé
morsli_laloute Messages postés 3 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 12 janvier 2010 - 7 janv. 2010 à 03:58
morsli_laloute Messages postés 3 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 12 janvier 2010 - 12 janv. 2010 à 02:52
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
A voir également:

12 réponses

chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
7 janv. 2010 à 19:30
j'ai bien peur que sois obligé de passer par du PL/SQL pour répondre au 2 conditions...
0
morsli_laloute Messages postés 3 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 12 janvier 2010
8 janv. 2010 à 02:16
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
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
8 janv. 2010 à 23:12
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
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
8 janv. 2010 à 23:57
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
9 janv. 2010 à 09:33
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
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
9 janv. 2010 à 13:17
Bonjour,
Ah ... désolé ... effectivement, cela change pas mal les choses ;-)
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
9 janv. 2010 à 14:11
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
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
9 janv. 2010 à 14:33
je regarde avec si avec un DECODE on peut s'en sortir ...

A+ (environ 1/2 heure ...)
0
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
9 janv. 2010 à 14:37
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
BadGuitarist Messages postés 367 Date d'inscription dimanche 12 octobre 2008 Statut Membre Dernière intervention 20 octobre 2013 27
9 janv. 2010 à 16:02
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
chuka Messages postés 965 Date d'inscription samedi 11 octobre 2008 Statut Membre Dernière intervention 29 juillet 2010 378
9 janv. 2010 à 16:08
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
morsli_laloute Messages postés 3 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 12 janvier 2010
12 janv. 2010 à 02:52
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