wymyslilem cos takego...
DECLARE
przestrzen VARCHAR2(100);
bloks dba_segments.blocks%TYPE;
seg NUMBER;
uzytkownik VARCHAR2(50);
segmenttyp VARCHAR2(50);
CURSOR space_check IS SELECT DISTINCT ddf.tablespace_name, total totalSize, (total-NVL(wolne,0)) uzyte, wolne, block_size
FROM (SELECT tablespace_name,SUM(bytes) total FROM dba_data_files GROUP BY tablespace_name) ddf,
(SELECT tablespace_name,SUM(bytes) wolne FROM dba_free_space GROUP BY tablespace_name) dfs,
dba_tablespaces
WHERE ddf.tablespace_name = dfs.tablespace_name(+) AND ddf.tablespace_name = przestrzen;
r_space_check space_check%ROWTYPE;
BEGIN uzytkownik:='gkoti'; --deklaracja nazwy uzytkownika
segmenttyp:='table'; --deklaracja typu obiektu segmentu
SELECT DISTINCT tablespace_name, blocks INTO przestrzen, bloks
FROM dba_segments WHERE LOWER(owner) LIKE uzytkownik AND LOWER(segment_type) LIKE segmenttyp;
OPEN space_check;
LOOP
FETCH space_check INTO r_space_check; EXIT WHEN space_check%NOTFOUND;
seg:=(r_space_check.totalSize/(bloks*r_space_check.block_size));
DBMS_OUTPUT.PUT_LINE('Program ma na celu pokazanie zajętego miejsca przez dane w tabelach');
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Użytkownik: '||uzytkownik);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Przestrzeń tabel: '||r_space_check.tablespace_name);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Typ segmentów dla obiektów: '||segmenttyp);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Rozmiar przestrzeni tabel: '||r_space_check.totalSize||' bajtów');
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Zajęte miejsce w przestrzeni: '||r_space_check.uzyte||' bajtów');
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Wolne miejsce w przestrzeni: '||r_space_check.wolne||' bajtów');
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Ilość segmentów w przestrzeni: '||seg);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Ilość bloków: '||bloks);
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Rozmiar bloku w segmencie: '||r_space_check.block_size||' bajtów');
DBMS_OUTPUT.PUT_LINE('-------------------------------------------------------------------');
END LOOP;
CLOSE space_check;
END;
po czesci gdzies troszke podejrzane po czesci dopisane przeze mnie

czy to napewno nie pokazalo mi smieci

wynik ponizej :
Program ma na celu pokazanie zajętego miejsca przez dane w tabelach
-------------------------------------------------------------------
Użytkownik: gkoti
-------------------------------------------------------------------
Przestrzeń tabel: USERS
-------------------------------------------------------------------
Typ segmentów dla obiektów: table
-------------------------------------------------------------------
Rozmiar przestrzeni tabel: 5242880 bajtów
-------------------------------------------------------------------
Zajęte miejsce w przestrzeni: 786432 bajtów
-------------------------------------------------------------------
Wolne miejsce w przestrzeni: 4456448 bajtów
-------------------------------------------------------------------
Ilość segmentów w przestrzeni: 80
-------------------------------------------------------------------
Ilość bloków: 8
-------------------------------------------------------------------
Rozmiar bloku w segmencie: 8192 bajtów
-------------------------------------------------------------------
podejzyjcie i pomyslcie i ocencie plissss

Dokonałem wersji finalnej zliczajacej bajty w kazdej kolumnie tabeli - oto kod (może sie komus jeszcze przyda):
DECLARE
CURSOR c_col1 IS SELECT table_name FROM USER_TAB_COLUMNS; r_c_col1 c_col1%ROWTYPE;
------------------------
CURSOR c_col2(tabelka VARCHAR2) IS SELECT column_name FROM USER_TAB_COLUMNS WHERE table_name = tabelka;
r_c_col2 c_col2%ROWTYPE;
------------------------
TYPE KURSOR IS REF CURSOR;
z_kursor KURSOR;
r_z_kursor NUMBER(10);
dl NUMBER(10);
zm_sql VARCHAR2(1000);
BEGIN DBMS_OUTPUT.ENABLE(1000000);
dl:=0;
OPEN c_col1;
LOOP
FETCH c_col1 INTO r_c_col1; EXIT WHEN c_col1%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Tabela : '||r_c_col1.table_name);
OPEN c_col2(r_c_col1.table_name);
LOOP
FETCH c_col2 INTO r_c_col2; EXIT WHEN c_col2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE('Kolumna : '||r_c_col2.column_name);
zm_sql:='SELECT LENGTHB('||r_c_col2.column_name||') from '||r_c_col1.table_name; OPEN z_kursor FOR zm_sql;
LOOP
FETCH z_kursor INTO r_z_kursor; EXIT WHEN z_kursor%NOTFOUND;
dl:=dl+r_z_kursor;
DBMS_OUTPUT.PUT_LINE('Długość: '||r_z_kursor||'b');
END LOOP;
CLOSE z_kursor;
END LOOP;
CLOSE c_col2;
END LOOP;
CLOSE c_col1;
DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------------------------------------------');
DBMS_OUTPUT.PUT_LINE('Zajmowane miejsce przez dane w tabelach: '||dl||' bajtów');
DBMS_OUTPUT.PUT_LINE('--------------------------------------------------------------------------------------------');
END;
działa na małej ilości tabel - można wyłączyc wypisywanie bajtow z kazdej kolumny i bedzie git