【问题标题】:Get list of unique columns and actual length (Oracle)获取唯一列的列表和实际长度(Oracle)
【发布时间】:2021-01-05 07:03:13
【问题描述】:

我希望在我的数据仓库中统一多个列

我的源系统是基于 Oracle 的,我想在仓库中定义我的列,使给定的列名只能有一种数据类型和长度

我正在寻找有关在我的源系统中的列中使用的实际长度的信息,并且可以通过此脚本识别列名、数据类型和长度

SELECT DISTINCT
    column_name, 
    data_type, 
    data_length 
    
FROM 
    all_tab_columns 

ORDER BY
    column_name

但这不会导致各个列的实际 MAX(LENGTH())

这是否可能通过循环函数获得?

【问题讨论】:

  • 我的建议是使用 all_tab_columns 中的 data_length ,原因很简单,因为您的 OLTP 表允许数据达到该长度。如果您创建一个具有当前最大长度的列,并且明天如果有更长的新数据出现,那么您将需要 DDL 语句。
  • 嗨 Anup 我也想过这个问题,唯一的缺点是我们有很多列设置为最大值,导致不必要的大列长度
  • 您想要最大定义数据长度还是最长填充值?您是否为数字列的比例或精度而烦恼?
  • 嗨 APC,我正在寻找最长的填充值,主要是 varchar 数据类型

标签: oracle architecture


【解决方案1】:

大概是这样的吧?只是一个想法,随意修改。

SQL> set serveroutput on;
SQL> declare
  2    l_str    varchar2(500);
  3    l_maxlen number;
  4  begin
  5    for cur_r in (select table_name, column_name, data_type
  6                  from user_tab_columns
  7                  where table_name in ('EMP', 'DEPT')
  8                  order by table_name, column_name
  9                 )
 10    loop
 11      l_str := 'select max(length(' || cur_r.column_name || '))' ||
 12               ' from ' || cur_r.table_name;
 13      execute immediate l_str into l_maxlen;
 14
 15      dbms_output.put_line(cur_r.table_name ||'.'|| cur_r.column_name ||
 16                           ' - ' || cur_r.data_type ||': '|| l_maxlen);
 17    end loop;
 18  end;
 19  /
DEPT.DEPTNO - NUMBER: 2
DEPT.DNAME - VARCHAR2: 10
DEPT.LOC - VARCHAR2: 8
EMP.COMM - NUMBER: 4
EMP.DEPTNO - NUMBER: 2
EMP.EMPNO - NUMBER: 4
EMP.ENAME - VARCHAR2: 6
EMP.HIREDATE - DATE: 8
EMP.JOB - VARCHAR2: 9
EMP.MGR - NUMBER: 4
EMP.SAL - NUMBER: 4

PL/SQL procedure successfully completed.

SQL>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-06
    • 2019-08-10
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 2023-03-25
    • 2016-05-18
    • 2016-05-31
    相关资源
    最近更新 更多