Intereting Posts
Синтаксическая ошибка Postgres на уровне или рядом с "IF" Можно ли получить несколько значений из подзапроса? Как разделять диапазоны дат в зависимости от месяцев в SQL Server 2005 Как эффективно запрашивать отношения «многие ко многим» на двух столбцах Добавление столбцов двух отношений в postgresql Использовать псевдоним таблицы в другом запросе для перемещения по дереву Создание предложений запроса с помощью korma и clojure найти прошедшее время между двумя датами в оракуле sql Точечный продукт в таблице SQL со многими столбцами Функция SQL для преобразования координат ОС Великобритании с востока на север и долготу и широту Можно ли использовать STWithin или STContains для обновления столбцов на основе точки в отношениях между многоугольниками? Посмотрите список значений в диапазонах (бинах), определенных двумя столбцами в другой таблице, и получите соответствующее значение из третьего столбца Запрос Sql для вставки даты и времени в SQL Server Выполнение команды COPY в удаленной базе данных с использованием локального файла Как перевести List <string> в SqlParameter для инструкции Sql In?

Получить max (длина (столбец)) для всех столбцов в таблице Oracle

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

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

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

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

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

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

 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' может зацикливаться и на все таблицы, но для меня это нормально.

Вы можете попробовать это; хотя он использует 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; /