/一个去重的小存储过程,参数为模式名/
CREATE OR REPLACE
PROCEDURE P_REMOVE(SCHEMA_NAME VARCHAR(50))
AS
V_ALL_COLUMS VARCHAR(1000);
BEGIN
FOR REC IN
(
SELECT
OWNER AS SCH_NAME,
TABLE_NAME AS TAB_NAME
FROM
ALL_TABLES
WHERE
OWNER =SCHEMA_NAME --指定模式名
)
LOOP
BEGIN
select
WM_CONCAT(COLUMN_NAME)
INTO
V_ALL_COLUMS
from
ALL_TAB_COLUMNS
where
table_name=REC.TAB_NAME
AND OWNER =REC.SCH_NAME;
--PRINT 'delete from "'||REC.SCH_NAME||'"."'||REC.TAB_NAME||'"'||' WHERE ('||V_ALL_COLUMS||') in (select ' ||V_ALL_COLUMS||' FROM '||REC.SCH_NAME||'.'||REC.TAB_NAME||' group by '||V_ALL_COLUMS|| ' having count(*) > 1) and rowid not in (select min(rowid) from '||REC.SCH_NAME||'.'||REC.TAB_NAME ||' group by '||V_ALL_COLUMS||' having count(*) > 1)';
EXECUTE IMMEDIATE 'delete from "'||REC.SCH_NAME||'"."'||REC.TAB_NAME||'"'||' WHERE ('||V_ALL_COLUMS||') in (select ' ||V_ALL_COLUMS||' FROM '||REC.SCH_NAME||'.'||REC.TAB_NAME||' group by '||V_ALL_COLUMS|| ' having count(*) > 1) and rowid not in (select min(rowid) from '||REC.SCH_NAME||'.'||REC.TAB_NAME ||' group by '||V_ALL_COLUMS||' having count(*) > 1)';
COMMIT;
END;
END LOOP;
END ;
/例如,去重test用户下的表/
call P_REMOVE(‘TEST’);