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é :
j'obtient bien :
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');
TABLE_NAME NB
-------------------- ----------
owner.table1 26
et je voudrais faire ça sur toutes les tables du select :
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 ?
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;
j'ai testé ceci mais ça ne marche pas :
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
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; /
avec pour ligne 20:
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
20 Open crsData FOR l_sql USING line.table_name;
je ne sais plus quoi tester... please helppp
Partager