获取Oracle表中所有列的max(长度(列))

时间:2015-02-04 16:57:57

标签: sql oracle loops oracle11g max

我需要在一堆表中获得每列的最大数据长度。我可以单独做每个表,但我正在寻找一种方法来遍历表中的所有列。

我目前正在使用以下查询来获取每列的最大值 -

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

我基本上用表中的每一列替换exampleColumnName。 我已经完成了3-4个线程,但它们都没有为我工作,因为它们不适合Oracle,或者它们有我需要的更多细节(而且我无法选择我需要的部分)。

我更喜欢用SQL而不是PLSQL,因为我没有任何创建权限,也无法创建任何PLSQL对象。

2 个答案:

答案 0 :(得分: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'也可能会为所有表循环,但现在这对我来说没问题。

答案 1 :(得分: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;
/