Danke,
Matthias (Newbie auf dem Gebiet)
P.S. also mit sqlplus das ganze
MfG Michael
Kathinka Diehl wrote:
>
> milan chrobok <milan....@bln1.siemens.de> wrote:
>
> > ich will wissen welche Spalten in meiner Datenbank in allen Datensätzen
> > nur null values enthalten, wie mache ich dies ?
>
> select count(*)
> from tabelle
> where spalte1 is null
> and spalte2 is null
> ...
Hmmm...,
anscheinend meine Frage falsch gestellt.
Ich möchte eine Abfrage machen die mir alle Spalten(namen) liefert, in
denen _nie_ ein Wert steht sondern immer nur null. Quasi alle völlig
unbenutzten Spalten.
Danke,
Matthias (ich weiss anderer Name bei der Mail...)
Gruss
Wolfgang
mit 8i und unter einem user mit dba-Berechtigung in SQL*Plus und mit sehr,
sehr viel Geduld z.B. mit
set serveroutput on
declare
l_col number := 0;
l_row number := 0;
begin
for l_c in (select owner, table_name, column_name
from dba_tab_columns)
loop
execute immediate 'select count(*) from ' ||
l_c.owner || '.' ||
l_c.table_name ||
' where ' || l_c.column_name
|| ' is null' into l_col;
execute immediate 'select count(*) from ' ||
l_c.owner || '.' ||
l_c.table_name into l_row;
if l_row = l_col then
dbms_output.put_line('Treffer fuer ' || l_c.owner || '.' ||
l_c.table_name || ', Spalte ' || l_c.column_name);
end if;
end loop;
end;
/
Da dabei aber auch alle Systemtabellen von Oracle durchpflügt werden (und
das sind einige !), ist es empfehlenswerter, das für jedes gewünschte Schema
(= user mit Objekten) zu tun, dann ist anstelle
for l_c in (select owner, table_name, column_name
from dba_tab_columns)
statt dessen
for l_c in (select owner, table_name, column_name
from dba_tab_columns where owner =
upper('name_des_gewuenschten_users'))
zu verwenden.
Disclaimer: Keine Garantie für die Richtigkeit der Lösung!
Klaus
SQL> create table test1(a varchar2(1));
SQL> insert into test1 values ('X');
SQL> commit;
SQL> select num_nulls from user_tab_columns where table_name = 'TEST1';
NUM_NULLS
----------
SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------
SQL> analyze table test1 compute statistics;
SQL> select num_nulls from user_tab_columns where table_name = 'TEST1';
NUM_NULLS
----------
0
SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------
1
SQL> update test1 set a = null;
SQL> commit;
SQL> select num_distinct from user_tab_columns where table_name = 'TEST1';
NUM_DISTINCT
------------
1
Klaus