删除与oracle中CREATED_BY列匹配的所有表中的行

Delete rows in all tables matched by CREATED_BY column in oracle

我的所有数据库表中都有 CREATED_BY 列。我想删除按 CREATED_BY='xyz' 列值行进的所有表中的行。有没有一种简单的方法来实现这个 oracle 数据库,而不是编写单独的 DELETE 查询。

试试这个

DELETE (SELECT *
        FROM tab1 
        INNER JOIN tab2
            ON tab1.id= tab2.id
        WHERE tab1.id >= any_value
            )

它将删除两个表中的数据。

您需要如下所示的 Procedure。这会将 'xyz' 作为输入并删除所有具有 created_by = 'xyz'

的 table 中的所有行
CREATE OR REPLACE PROCEDURE del_row (usrnm VARCHAR2)
AS
   TYPE var IS TABLE OF VARCHAR2 (100)
      INDEX BY PLS_INTEGER;

   v_var   var;

   v_sql   VARCHAR2 (1000);
BEGIN
   SELECT tname
     BULK COLLECT INTO v_var
     FROM col
    WHERE cname = 'CREATED_BY';

   FOR i IN 1 .. v_var.COUNT
   LOOP
      v_sql := 'Delete from  ' || v_var (i) || ' where CREATED_BY like ''%'||usrnm||'%''';          
      EXECUTE IMMEDIATE v_sql  ;
   END LOOP;

   COMMIT;
END;

演示:

CREATE  TABLE testt
(
   col1         VARCHAR2 (1),
   created_by   VARCHAR2 (3)
);


SQL> SELECT * FROM testt;

C CRE
- ---
A XYZ
B XYZ

SQL> EXEC del_row('XYZ');

PL/SQL procedure successfully completed.

SQL> SELECT * FROM testt;

no rows selected

您可以循环 user_tab_columns 并在 EXECUTE IMMEDIATE 中删除 运行。在最终代码中使用适当的异常。

SET SERVEROUTPUT ON

BEGIN
   FOR t IN (SELECT TABLE_NAME
               FROM USER_TAB_COLUMNS
              WHERE COLUMN_NAME = 'CREATED_BY')
   LOOP
      DBMS_OUTPUT.PUT_LINE (
         'DELETE FROM ' || t.TABLE_NAME || ' WHERE CREATED_BY = ''xyz''');

      EXECUTE IMMEDIATE
         'DELETE FROM ' || t.TABLE_NAME || ' WHERE CREATED_BY = ''xyz''';
   END LOOP;
END;