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
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
A voir également:
- Requête SQL dans Oracle
- Datediff oracle ✓ - Forum Oracle
- Oracle liste des tables ✓ - Forum Oracle
- Sql lister les tables ✓ - Forum Programmation
- Blob sql ✓ - Forum Webmastering
- Récupération serveur sql - Télécharger - Gestion de données
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
7 janv. 2010 à 19:30
j'ai bien peur que sois obligé de passer par du PL/SQL pour répondre au 2 conditions...
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
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!
Si on ne peut pas le faire par une req SQL, quelles la syntaxe en PL/SQL, (je suis nouveau en Oracle).
Merci!
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
8 janv. 2010 à 23:12
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;
@+
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
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 :
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
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
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....)
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;
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
9 janv. 2010 à 13:17
Bonjour,
Ah ... désolé ... effectivement, cela change pas mal les choses ;-)
Ah ... désolé ... effectivement, cela change pas mal les choses ;-)
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
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!!
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!!
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
9 janv. 2010 à 14:33
je regarde avec si avec un DECODE on peut s'en sortir ...
A+ (environ 1/2 heure ...)
A+ (environ 1/2 heure ...)
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
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!!
@+
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!!
@+
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
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 :
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.
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
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...!!;)))
@+
Mais bon y'a toujours des solutions, plus ou moins simple...!!;)))
@+
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
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!
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!