首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获取Oracle表中所有列的max(length(column))

获取Oracle表中所有列的max(length(column))
EN

Stack Overflow用户
提问于 2015-02-05 00:57:57
回答 2查看 10.8K关注 0票数 1

我需要获取一组表中每列的最大数据长度。我可以单独处理每个表,但我正在寻找一种至少遍历表中所有列的方法。

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

代码语言:javascript
复制
select max(length(exampleColumnName)) 
from exampleSchema.exampleTableName;

我基本上是用表中的每一列替换exampleColumnName。我已经经历了3-4个线程,但没有一个线程适合我,要么是因为它们不是为Oracle编写的,要么是因为它们有我需要的更多细节(我不能选择我需要的部分)。

我更喜欢在SQL中使用它,而不是PLSQL中,因为我没有任何create特权,也不能创建任何PLSQL对象。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-05 01:46:31

让下面的查询起作用-

代码语言:javascript
复制
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'可能也会对所有表进行循环,但现在这对我来说是可以的。

票数 3
EN

Stack Overflow用户

发布于 2015-02-05 02:51:27

您可以尝试这样做;尽管它使用PL/SQL,但它可以在SQL-Plus中工作。它不会循环。希望您的列不会太多,以至于SELECT查询无法容纳32,767个字符!

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28327071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档