powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите усовершенствовать скрипт
3 сообщений из 3, страница 1 из 1
Помогите усовершенствовать скрипт
    #39328797
Jonhson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
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.
40.
41.
42.
43.
44.
45.
46.
create table dist_val ( name varchar2(30) not null, 
                        colname varchar2(30) not null, 
                        val     varchar2(1000) not null,
                        cnt     number      not null,
                        primary key(name, colname, val))
organization index compress 2
tablespace USERS
overflow tablespace USERS ; 


declare 
    --null_v      constant varchar2(6):= '<NULL>';
    st          varchar2(4000);
    l_errcnt    int := 0;
begin
    for tab in (select table_name, column_name 
                from user_tab_columns 
                where table_name in (select table_name from user_tables
                                        where table_name != 'DIST_VAL')
                        and data_type in ('NUMBER', 'CHAR', 'DATE', 'VARCHAR2'
                         --   , 'TIMESTAMP(6)', 'TIMESTAMP(9)' 
                         )
                --    and rownum <=1
                order by table_name, column_name
                )
    loop
        begin
            st := ' insert into DIST_VAL select '''|| tab.table_name || ''', ''' || tab.column_name 
                ||  ''', substr(nvl(to_char(' || tab.column_name || '),''<NULL>''), 1, 1000) t, count(*) cnt from ' 
                || tab.table_name || ' group by ' || tab.column_name;
            --dbms_output.put_line(st);
            execute immediate st;  
        exception    
        when others then
            l_errcnt := l_errcnt + 1;
            dbms_output.put_line(sqlerrm || ' on ' || st || ' ' || tab.table_name || '.' || tab.column_name || ' is skipped ' );
        end;
    end loop;     
    commit;     
    dbms_output.put_line('done with ' || l_errcnt || ' errors.');       
exception
    when others then 
        rollback;
        raise;            
end;
/




есть мнение, что если у таблицы много (N) атрибутов, то сканировать её все N раз совсем не нужно... а можно вычислить одновременно значения по всем столбцам.

Но вот как сделать сие на 12.1 оракле пока в голову не приходит.

Подскажите пожалуйста.
...
Рейтинг: 0 / 0
Помогите усовершенствовать скрипт
    #39328845
Valergrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если по поводу этого запроса, то count distinct + pivot.
А еще dbms_stats умеет делать то же самое, что вы хотите - посчитать количество уникальных значений для каждого столбца. Не хотите оттуда брать значения?

И зачем обрезать tab.column_name до первых тысячи символов? Оно и так не длинее 30 всегда.
...
Рейтинг: 0 / 0
Помогите усовершенствовать скрипт
    #39328881
Jonhson
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ValergradЕсли по поводу этого запроса, то count distinct + pivot.


ммм а подробнее?

ValergradА еще dbms_stats умеет делать то же самое, что вы хотите - посчитать количество уникальных значений для каждого столбца. Не хотите оттуда брать значения?

не только, скорее уник значение + кол-во. И есть мнение, что dbms_stats не вполне точно считает

ValergradИ зачем обрезать tab.column_name до первых тысячи символов? Оно и так не длинее 30 всегда.

обрезается значение приведённого к строке атрибута. Оно может быть до 4000 байт.
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Помогите усовершенствовать скрипт
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]