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; /
Partager