Requête SQL dans Oracle
morsli_laloute
Messages postés
3
Statut
Membre
-
morsli_laloute Messages postés 3 Statut Membre -
morsli_laloute Messages postés 3 Statut Membre -
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
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:
- Requête SQL dans Oracle
- Logiciel sql - Télécharger - Bases de données
- Oracle liste des tables ✓ - Forum Oracle
- Sql lister les tables ✓ - Forum Programmation
- Jointure sql ✓ - Forum MySQL
- Sql (+) - Forum Programmation
12 réponses
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!
Si on ne peut pas le faire par une req SQL, quelles la syntaxe en PL/SQL, (je suis nouveau en Oracle).
Merci!
Salut,
voila une petite solution qui peut t'aider..enfin j'espere!!;)
@+
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;
@+
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 :
et ça devrait le faire en utilisant que du SQL ;-)
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 ;-)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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....)
Et le script
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;
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!!
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!!
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!!
@+
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!!
@+
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 :
Pas vraiment simple mais je ne suis pas sûr que l'on peut faire autrement sans passer par un langage de programmation.
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.