删除与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;
我的所有数据库表中都有 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'
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;