2015-12-31 1 views
3

Я использую ниже запрос, чтобы получить максимальный диапазон всех столбцов всех таблиц в базе данных OracleMax Range и самый высокое значение Номер столбца во всех таблицах в базе данных Oracle

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_PRECISION,(POWER(10,DATA_PRECISION) -1) 
from ALL_TAB_COLUMNS where OWNER = 'MASTER' and DATA_TYPE = 'NUMBER' and 
DATA_PRECISION is NOT NULL order by TABLE_NAME ASC; 


OWNER TABLE_NAME COLUMN_NAME DATA_PRECISION (POWER(10,DATA_PRECISION) -1) 
MASTER TABLE_1  COL_1   7   9999999 
MASTER TABLE_1  COL_5   7   9999999 
MASTER TABLE_2  COL_3   10   9999999999 

Я пытаясь получить 6-й номер & 7-й столбец, который должен быть макс этого столбца в этой конкретной таблице и разница между максимальным диапазоном (т.е. (POWER (10, DATA_PRECISION) -1)) и фактическим максимальным значением в таблице.

Ex:

OWNER TABLE_NAME COLUMN_NAME DATA_PRECISION (POWER(10,DATA_PRECISION) -1) MAX_VALUE  DIFF 
MASTER TABLE_1  COL_1   7   9999999       9994637  5362 
MASTER TABLE_1  COL_5   7   9999999       9997637  2362 
MASTER TABLE_2  COL_3   10   9999999999     8933999999 1066000000 

Как этого добиться?

Могу ли я присоединиться к столам, используя TABLE_NAME?

Ставка, это было бы полезно для многих людей.

+0

Я не думаю, что вы можете сделать это без использования «выполнить немедленное», может быть? – OldProgrammer

ответ

2

Самый простой способ идти об этом, чтобы написать небольшую функцию, вы можете указать имя таблицы и колонки так:

CREATE OR REPLACE FUNCTION get_max_value (p_table_name VARCHAR2, p_column VARCHAR2) 
    RETURN NUMBER IS 
    v_query VARCHAR2(1000); 
    v_max_value NUMBER; 
BEGIN 
    v_query := 'SELECT MAX (' || p_column ||') FROM ' 
     || p_table_name ; 
    EXECUTE IMMEDIATE v_query 
     INTO v_max_value; 
    RETURN v_max_value; 
END; 

А потом немного измененную версию запроса выше:

SELECT owner, 
     table_name, 
     column_name, 
     data_precision, 
     (POWER(10,data_precision) -1) , 
     get_max_value (owner || '.' || table_name, column_name) max_val 
FROM all_tab_columns 
WHERE 1 = 1 
AND  owner = 'MASTER' 
AND  data_type = 'NUMBER' 
AND  data_precision is NOT NULL 
AND  table_name NOT LIKE '%$%' 
ORDER BY c.table_name ASC 

Просто будьте осторожны, в зависимости от количества ваших таблиц и количества строк в каждой, выполнение может занять некоторое время.

0

Преобразовать DBA_TAB_COLUMNS.HIGH_VALUE до максимального значения, как описано в this post by Jonathan Lewis.

Максимальные и минимальные значения записываются при собраны статистические таблицы. Если используется процент оценки по умолчанию, и статистика была собрана в последнее время, значение будет точным.

create or replace function raw_to_num(i_raw raw) 
return number 
as 
    m_n number; 
begin 
    dbms_stats.convert_raw_value(i_raw,m_n); 
    return m_n; 
end; 
/ 

select owner,table_name,column_name,data_precision 
    ,(power(10,data_precision) -1) max_range 
    ,raw_to_num(high_value) max_value 
    ,(power(10,data_precision) -1) - raw_to_num(high_value) diff 
from dba_tab_columns 
where data_type = 'NUMBER' 
    and owner = user 
    --Add conditions for specific users and tables. 
order by owner, table_name, column_name; 
Смежные вопросы