2017-11-03 20 views
-1

データベースのすべての表にCREATED_BY列があります。私はCREATED_BY = 'xyz'列の値で行かれたすべてのテーブルの行を削除します。個別のDELETE問合せを作成するのではなく、このOracleデータベースを実現する簡単な方法があります。oracleのCREATED_BY列と一致するすべての表の行を削除します

+0

は、すべてのテーブル名を取得自分で作成し、各テーブルから削除する手順を書いて、「XYZ」 – Darzen

+0

の代わりに、ストアドプロシージャによって作成された行は、私が達成することができますSQL Developerのようないくつかのツールがありますこの? – user1614862

+0

@ user1614862あなたの要件を満たすためにカスタマイズされたツールはありません。手順は良い考えです。どのようにそれを使用することができます下記を参照してください。 – XING

答えて

0

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 
+0

削除クエリで=の代わりに「好き」を使用することはできますか?実際にcreated_by列はxyzで始まる値を持ちますが、最後に「xyz_anyString」のような値があります。xyz_ % ' – user1614862

+0

@ user1614862必要に応じて質問を変更することができます。それは問題ではありません。編集ポストでどのように参照してください – XING

-1

は、それは両方のテーブルからデータを削除します。この

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

を試してみてください。

+0

2つのテーブルからではなく、データベースに1000個のテーブルがあるので、一般的なクエリでそれをやりたかったのです。 – user1614862

+0

うん..私が投稿したもの。私は2つのテーブルを使用しました。複数のテーブルに参加して、それが機能する場合は削除を試みることができます。 –

+0

それは私が1000テーブルのためにできないものです、そうですか? – user1614862

1

することができます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; 
+0

'DISTINCT'は余分です。テーブルには同じ名前の列が2つありません。 –

+0

@ThorstenKettner:ありがとう。かわった 。私はおそらく、まずall_tab_columnsを使うことを考えました。 –

関連する問題