如何获得几乎与最大允许大小一样长的所有列
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;
结果如下:
- 20(不重要,因为最大允许长度为 30)
- 30 (很重要,因为允许的最大长度为 30)
- 30(不重要,因为最大允许长度为 50)
- 50 (很重要,因为允许的最大长度为 50)
是否可以通过脚本或语句找到所有这些?
可以 PL/SQL:
在你的专栏上做一个FOR LOOP
,
打印输出最大数据长度;您可以在准备好的语句中添加比较 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_LENGTH
列 USER_TAB_COLUMNS
。
还要考虑 CHAR
数据类型字段将始终用空格填充:因此 LENGHT()
将为您提供为数据类型定义的长度(您可以在 LENGTH()
).
是否可以获取所有列(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;
结果如下:
- 20(不重要,因为最大允许长度为 30)
- 30 (很重要,因为允许的最大长度为 30)
- 30(不重要,因为最大允许长度为 50)
- 50 (很重要,因为允许的最大长度为 50)
是否可以通过脚本或语句找到所有这些?
可以 PL/SQL:
在你的专栏上做一个
FOR LOOP
,打印输出最大数据长度;您可以在准备好的语句中添加比较
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_LENGTH
列 USER_TAB_COLUMNS
。
还要考虑 CHAR
数据类型字段将始终用空格填充:因此 LENGHT()
将为您提供为数据类型定义的长度(您可以在 LENGTH()
).