Bonjour,
Y a t'il un moyen de retrouver les tables contenant une valeur précise ?
Merci
Bonjour,
Y a t'il un moyen de retrouver les tables contenant une valeur précise ?
Merci
Oui. Question posée moulte fois.
Avec du sql dynamique (EXECUTE IMMEDIATE).
c'est à dire ?
je connais la méthode pour créer des requetes à base de variable et de chaine de caractère mais la je ne vois pas le rapport ?
Merci
Pour ceux qui serait interressé
CREATE OR REPLACE FUNCTION LISTE_TABLE (monSchema IN VARCHAR2,maValeur IN VARCHAR2 ) RETURN VARCHAR2
IS
/* VARIABLES */
nomTable VARCHAR2(100);
nomCol VARCHAR2(100);
lstTable VARCHAR(5000);
maTable VARCHAR2(100);
maRequete VARCHAR2(20000);
nbTable NUMBER;
/* CURSOR */
CURSOR lstTables IS
SELECT table_name,
column_name
FROM all_tab_cols WHERE owner = monSchema and DATA_TYPE='VARCHAR2' ;
/* CORPS */
BEGIN
lstTable:='';
OPEN lstTables;
LOOP
maTable:='';
FETCH lstTables INTO nomTable,nomCol ;
EXIT WHEN lstTables%NOTFOUND;
maRequete:='Select count('''||nomTable||''') From '||nomTable||' Where 1=1 and '||nomCol||'='''||maValeur||'''';
--DBMS_OUTPUT.PUT_LINE(maRequete);
EXECUTE IMMEDIATE maRequete INTO nbTable;
if(nbTable>0) THEN
DBMS_OUTPUT.PUT_LINE(nomTable);
end if;
END LOOP;
CLOSE lstTables;
return lstTable;
END;
/
Merci beegood... j'avais aussi le même besoin et la fonction marche très bien
LBO72.
J'ai corrigé et optimisé le code.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 CREATE OR REPLACE FUNCTION LISTE_TABLE (monSchema IN VARCHAR2, maValeur IN VARCHAR2) RETURN VARCHAR2 IS /* VARIABLES */ lstTable VARCHAR(5000); maRequete VARCHAR2(2000); nbTable NUMBER; /* CURSOR */ CURSOR c_lstTables IS SELECT table_name, column_name FROM ALL_TAB_COLS WHERE owner = monSchema AND data_type = 'VARCHAR2' ; /* CORPS */ BEGIN FOR r IN c_lstTables LOOP maRequete := 'Select count(*) From '||r.table_name || ' Where '||r.column_name||'= :1'; --DBMS_OUTPUT.PUT_LINE(maRequete); EXECUTE IMMEDIATE maRequete INTO nbTable USING maValeur; IF(nbTable > 0) THEN lstTable := lstTable || ', ' || r.table_name; DBMS_OUTPUT.PUT_LINE(r.table_name); END IF; END LOOP; RETURN LTRIM(lstTable, ', '); END; /
C'est exactement ce que j'ai fait
Je suis content de moi, j'ai eu la même idée qu'un Grand Expert
LBO72.
C'est bien, t'as un bon point
attention : c'est un peu facile de direaprès coupC'est exactement ce que j'ai fait
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager