17,090
社区成员
发帖
与我相关
我的任务
分享
select t.*
from (
select t.*,avg(length(t.COLUMN_NAME))over() avglen
from user_tab_columns t
)t
where length(t.COLUMN_NAME)>avglen
select *
from
(
select t.*,max(cc)over() maxcc
from (
select t.*,count(length(t.COLUMN_NAME))over(partition by length(t.COLUMN_NAME) ) cc
from user_tab_columns t
)t
)t
where t.cc<>maxcc
select *
from (
select t.*,avg(t.DATA_LENGTH)over(partition by t.COLUMN_NAME ) avglength
from user_tab_columns t
-- where t.COLUMN_NAME=upper('colname')
)t
where t.DATA_LENGTH<>round(avglength)
CREATE OR REPLACE PROCEDURE CX_TAB_COL_LENGTH_AVG IS
V_NOTNULLID_F T_SYS_SHUJUZLFX.NOTNULLID%TYPE;
V_TABLENAME_F T_SYS_SHUJUZLFX.TABLE_NAME%TYPE;
V_NOTNULLID_S T_SYS_SHUJUZLFX.NOTNULLID%TYPE;
V_TABLENAME_S T_SYS_SHUJUZLFX.TABLE_NAME%TYPE;
V_COLUMN_LENGTH VARCHAR2(100);
V_AVGLENGTH VARCHAR2(100);
V_AVG_MINUS_LENGTH NUMBER;
V_SQLSUBSTR VARCHAR2(4000);
CURSOR GETCOLUMN_AVGLENGTH IS
SELECT NOTNULLID, TABLE_NAME, AVG(LENGTH(COLUMN_NAME))
FROM T_SYS_SHUJUZLFX
WHERE YXL <> 0
AND COLUMN_NAME IS NOT NULL
GROUP BY NOTNULLID, TABLE_NAME;
CURSOR GETCOLUMN_LENGTH IS
SELECT NOTNULLID, TABLE_NAME, LENGTH(COLUMN_NAME)
FROM T_SYS_SHUJUZLFX
WHERE YXL <> 0
AND COLUMN_NAME IS NOT NULL;
--GROUP BY NOTNULLID, TABLE_NAME;
BEGIN
open GETCOLUMN_AVGLENGTH;
loop
fetch GETCOLUMN_AVGLENGTH
into V_NOTNULLID_F, V_TABLENAME_F, V_AVGLENGTH;
exit when GETCOLUMN_AVGLENGTH%notfound;
open GETCOLUMN_LENGTH;
loop
fetch GETCOLUMN_LENGTH
into V_NOTNULLID_S, V_TABLENAME_S, V_COLUMN_LENGTH;
exit when GETCOLUMN_LENGTH%notfound;
SELECT V_COLUMN_LENGTH - V_AVGLENGTH
INTO V_AVG_MINUS_LENGTH
FROM DUAL;
IF V_AVG_MINUS_LENGTH < 0 THEN
EXIT;
ELSE
V_SQLSUBSTR := 'SELECT * FROM ' || V_TABLENAME_S || ';';
EXECUTE IMMEDIATE V_SQLSUBSTR;
END IF;
end loop;
close GETCOLUMN_LENGTH;
end loop;
close GETCOLUMN_AVGLENGTH;
END CX_TAB_COL_LENGTH_AVG;