如何获得几乎与最大允许大小一样长的所有列

How to get all columns which are nearly as long as the maximum allowed size

是否可以获取所有列(varchar2、char、nvarchar2),其中数据与 Oracle 数据库中列允许的最大大小一样长(或几乎一样长 - 少 2 个字符)?

通过以下语句,我得到了每列的最大允许大小:

select table_name, column_name, data_type, data_length 
from user_tab_columns 
where data_type in ('VARCHAR2', 'CHAR', 'NVARCHAR2') 
order by data_type;

现在我想找到每一列where max(length(column))+2 >= data_length

例如:

我的语句输出如下:

TableA  | ColumnA |  VARCHAR2 |  30
TableA  | ColumnB |  VARCHAR2 |  30
TableB  | ColumnA |  VARCHAR2 |  50
TableB  | ColumnB |  VARCHAR2 |  50

现在我必须运行

SELECT MAX(LENGTH(ColumnA)) FROM TableA;
SELECT MAX(LENGTH(ColumnB)) FROM TableA;
SELECT MAX(LENGTH(ColumnA)) FROM TableB;
SELECT MAX(LENGTH(ColumnB)) FROM TableB;

结果如下:

是否可以通过脚本或语句找到所有这些?

可以 PL/SQL:

  1. 在你的专栏上做一个FOR LOOP

  2. 打印输出最大数据长度;您可以在准备好的语句中添加比较 v_qry:

    declare
      v_qry varchar2(4000) := '';
      v_res number;
    begin
      for x in (
        select table_name, column_name, data_type, data_length 
          from user_tab_columns 
         where data_type in ('VARCHAR2', 'CHAR', 'NVARCHAR2') 
       order by data_type
      ) loop
         -- prepare your statement
         v_qry := 'select  MAX(LENGTH('||x.column_name||')) FROM '||x.table_name||' ';
         -- execute
         execute immediate v_qry into v_res;
         -- print result
        dbms_output.put_line('in:'||x.table_name||'.' ||x.column_name||':'||v_res||':compared to:'|| x.data_length);
      end loop;
    end;
    /
    

注意:这可能需要一些时间,具体取决于您的桌子大小

我的一张桌子 (MY) 给出:

in:MY.C_UTI_MAJ:6:compared to:6
in:MY.C_UTI_CRE:6:compared to:6
in:MY.C_TYP_PARAM:20:compared to:20
in:MY.PARAM:16:compared to:20
in:MY.DESCRIPTION:245:compared to:255

请考虑您在数据库中使用的编码。

例如,如果您使用的是 UTF8(AL32UTF8:一个字符有 4 个字节),您应该将 LENGTH() 的结果与 USER_TAB_COLUMNS 中的列 CHAR_LENGTH 以及 USER_TAB_COLUMNS 的结果进行比较LENGTHB() DATA_LENGTHUSER_TAB_COLUMNS

还要考虑 CHAR 数据类型字段将始终用空格填充:因此 LENGHT() 将为您提供为数据类型定义的长度(您可以在 LENGTH()).