2015-02-04 3 views
1

Мне нужно получить максимальную длину данных для каждого столбца в кучке таблиц. Я в порядке с каждой таблицей индивидуально, но я ищу способ прорезать все столбцы в таблице, по крайней мере.Получить max (длина (столбец)) для всех столбцов в таблице Oracle

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

select max(length(exampleColumnName)) 
from exampleSchema.exampleTableName; 

Я в основном заменяя exampleColumnName каждого столбец в таблице. Я уже прошел через 3-4 потока, но ни один из них не работал для меня ни потому, что они не были для Oracle, либо у них было больше деталей, которые мне нужны (и я не мог выбрать нужную мне часть).

Я бы предпочел иметь его в SQL, чем в PLSQL, так как у меня нет никаких прав на создание и вы не сможете создавать любые PLSQL-объекты.

ответ

2

Получили ниже запрос на работу -

DECLARE 
    max_length INTEGER; --Declare a variable to store max length in. 
    v_owner VARCHAR2(255) :='exampleSchema';  -- Type the owner of the tables you are looking at 

BEGIN 
    -- loop through column names in all_tab_columns for a given table 
    FOR t IN (SELECT table_name, column_name FROM all_tab_cols where owner=v_owner and table_name = 'exampleTableName') LOOP 

    EXECUTE IMMEDIATE 
    -- store maximum length of each looped column in max_length variable 
    'select nvl(max(length('||t.column_name||')),0) FROM '||t.table_name 
    INTO max_length; 

    IF max_length >= 0 THEN -- this isn't really necessary but just to ignore empty columns. nvl might work as well 
     dbms_output.put_line(t.table_name ||' '||t.column_name||' '||max_length); --print the tableName, columnName and max length 
    END IF; 

    END LOOP; 
END; 

Дайте мне знать, если комментарии объяснить достаточно, то я постараюсь сделать лучше. Удаление table_name = 'exampleTableName' может зацикливаться и на все таблицы, но для меня это нормально.

0

Вы можете попробовать это; хотя он использует PL/SQL, он будет работать из SQL-Plus. Он не зацикливается. Надеюсь, у вас не так много столбцов, что запрос SELECT не может поместиться в 32 767 символов!

SET SERVEROUTPUT ON 
DECLARE 
    v_sql VARCHAR2(32767); 
    v_result NUMBER; 
BEGIN 
    SELECT 'SELECT GREATEST(' || column_list || ') FROM ' || table_name 
     INTO v_sql 
     FROM (
     SELECT table_name, LISTAGG('MAX(LENGTH(' || column_name || '))', ',') WITHIN GROUP (ORDER BY NULL) AS column_list 
      FROM all_tab_columns 
     WHERE owner = 'EXAMPLE_SCHEMA' 
      AND table_name = 'EXAMPLE_TABLE' 
     GROUP BY table_name 
    ); 
    EXECUTE IMMEDIATE v_sql INTO v_result; 
    DBMS_OUTPUT.PUT_LINE(v_result); 
END; 
/
+0

Когда я запускаю вышеуказанный скрипт, я получаю только 1 вывод номера, который, как я предполагаю, является максимальным количеством всех столбцов таблицы (4000 в моем случае). Мне действительно нужна максимальная длина для каждого столбца в таблице. Я что-то пропустил? – vchollati

+0

Моя вина; Я не понял этот вопрос. –

Смежные вопросы