如何使用PL / SQL从我的所有oracle数据库表中删除重复的行?

时间:2017-02-21 10:18:17

标签: plsql

从特定用户拥有的所有表中删除完全重复的行的通用方法。

1 个答案:

答案 0 :(得分:2)

这是它的存储过程。不要忘记将“YOUR_USERNAME_HERE”替换为您的用户名。

CREATE OR REPLACE PROCEDURE DELETE_DUPLICATES_FROM_DB
IS
  TABLE_COLUMNS VARCHAR2(10000);
  DELETE_STATEMENT VARCHAR2(10000);
  CURSOR ALL_MY_TABLES IS SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = 'YOUR_USERNAME_HERE';
BEGIN
  FOR MY_TABLE IN ALL_MY_TABLES 
  LOOP
    SELECT LISTAGG(COLUMN_NAME, ',') WITHIN GROUP (ORDER BY 1) INTO TABLE_COLUMNS FROM USER_TAB_COLUMNS WHERE TABLE_NAME = MY_TABLE.TABLE_NAME;
    DELETE_STATEMENT := 'DELETE FROM ' || MY_TABLE.TABLE_NAME || ' WHERE ROWID NOT IN (SELECT MIN(ROWID) FROM ' || MY_TABLE.TABLE_NAME || ' GROUP BY ' || TABLE_COLUMNS || ');';
    EXECUTE IMMEDIATE DELETE_STATEMENT;
    DBMS_OUTPUT.PUT_LINE(DELETE_STATEMENT);--print the statements we run
  END LOOP;
END;