bonjour

ça fait 1 an que je n'ai plus fait de SQL et ça se sent... j'espère avoir mis le bon titre de post ^^

ce que je souhaite faire :

dans une base avec plusieurs shemas,
pour un schema particulier,
pour les tables de ce shema contenant une colone particuliere,
compter le nombre de doublons et afficher la colonne et le resultat du count

ça paraît super simple à la plupart d'entre vous j'imagine, mais je n'ai jamais fait de requètes imbriquées et ça fait 4h que je galère, donc voici ce que j'ai testé :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
select 'owner.table1' AS TABLE_NAME,count(*) FROM owner.table1 WHERE rowid NOT IN (SELECT max(rowid) FROM owner.table1 GROUP BY 'column_key');
j'obtient bien :

TABLE_NAME NB
-------------------- ----------
owner.table1 26

et je voudrais faire ça sur toutes les tables du select :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
SELECT owner,table_name,column_name FROM ALL_TAB_COLUMNS WHERE owner = 'owner1' and column_name = 'column_key;
c'est super simple comme concept : j'affiche à priori 1 colonne de résultats et une colonne de calculs sur la 1ère, je pense à un join ou qqch comme ça ?

j'ai testé ceci mais ça ne marche pas :

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
DECLARE
	Cursor listTables IS
		SELECT owner,table_name 
		FROM ALL_TAB_COLUMNS 
		WHERE owner = 'OPS$VTF' and column_name = 'BRCH_CODE';
	Type t_CurTyp IS Ref Cursor;
	crsData		t_CurTyp;
	columnName	varchar(100);
	lv_string	varchar(100);
	l_sql		Varchar2(32676);
BEGIN
	dbms_output.enable(400000);
	FOR line IN listTables
	LOOP
		lv_string:=('Table ' || line.owner || '.' || line.table_name);
		dbms_output.put_line(lv_string);
		l_sql := 'SELECT count(*) FROM ' || line.owner || '.' || line.table_name ||
		' WHERE rowid NOT IN (SELECT max(rowid) FROM ' || line.owner || '.' || line.table_name ||
		' GROUP BY "BRCH_CODE")';
		Open crsData FOR l_sql USING line.table_name;
		LOOP
			FETCH crsData INTO columnName;
			EXIT WHEN crsData%NOTFOUND;
			lv_string:=('Table ' || line.owner || '.' || line.table_name || ' : ' || columnName || ' lignes');
			dbms_output.put_line(lv_string);
		END LOOP;
		Close crsData;
	END LOOP;
END;
/
enfin si ça marche une fois, ça plante au bout de 15 lignes puis ça refuse de refonctionner, j'ai peur de casser qqch si j'insiste :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
Table OPS$VTF.BDT_C_DUE_DATE_ADV
Table OPS$VTF.BDT_C_DUE_DATE_ADV : 0 lignes
Table OPS$VTF.BDT_C_NOT_ADV
Table OPS$VTF.BDT_C_NOT_ADV : 0 lignes
Table OPS$VTF.BDT_P_ECR_PC
Table OPS$VTF.BDT_P_ECR_PC : 26 lignes
DECLARE
*
ERROR at line 1:
ORA-01006: bind variable does not exist
ORA-06512: at line 20
avec pour ligne 20:
20 Open crsData FOR l_sql USING line.table_name;


je ne sais plus quoi tester... please helppp