sql >> データベース >  >> RDS >> Oracle

pl/sqlを使用してバッチ操作を行う方法

    始める前に、これはひどいことだと言うつもりです。データベースの作成を自動化するスクリプトを作成している場合は、以下のクエリを破棄して、データベース展開スクリプトに属さないほどひどいので、コピー/貼り付けを行います。

    クエリ

    DECLARE
        CURSOR TABLES IS SELECT * FROM USER_TABLES
                         WHERE 0 = (SELECT COUNT(*)
                                    FROM USER_CONSTRAINTS
                                    WHERE USER_CONSTRAINTS.TABLE_NAME = USER_TABLES.TABLE_NAME 
                                    AND USER_CONSTRAINTS.CONSTRAINT_TYPE = 'P'
                                   );
    BEGIN
        FOR T IN TABLES LOOP
            EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD ID NUMBER(12)';
            EXECUTE IMMEDIATE 'CREATE SEQUENCE '||T.TABLE_NAME||'Seq START WITH 1';
            EXECUTE IMMEDIATE 'UPDATE '||T.TABLE_NAME||' SET ID = '||T.TABLE_NAME||'Seq.NEXTVAL';
            EXECUTE IMMEDIATE 'ALTER TABLE '||T.TABLE_NAME||' ADD PRIMARY KEY (ID)';
            EXECUTE IMMEDIATE 'CREATE OR REPLACE TRIGGER '||T.TABLE_NAME||'PKSet '||CHR(10)
                              ||'BEFORE INSERT ON '||T.TABLE_NAME||' '||CHR(10)
                              ||'FOR EACH ROW '||CHR(10)
                              ||'BEGIN '||CHR(10)
                              ||':NEW.ID := '||T.TABLE_NAME||'Seq.NEXTVAL; '||CHR(10)
                              ||'END; ';
        END LOOP;
    END;
    /
    

    これは何をしますか?

    基本的に、テーブルのリストを取得し、SQLを動的に構築して、関連するさまざまなタスクを実行します。 EXECUTE IMMEDIATE SQLを構築した文字列を取得して実行します。 CHR(10) 不快感は改行です。空白を除外するとOracleの解析にどのように影響するかわからないため、空白が必要でした。いくつかの場所で、テーブル名を他のテキストに直接連結して、シーケンスまたはPK制約名を生成することに注意してください。

    作成時にテーブル名を引用し、小文字を使用している場合、これはエラーになる場合とエラーにならない場合があります。エラーが発生した場合は、すべてのステートメントにコミットが含まれることに注意してください。エラーは、プロセスが半分完了したことを意味します。スキーマが現在のユーザーでない場合も失敗します。 (USER_TABLESを変更する必要があります ALL_TABLESへ SQLをビルドするときに、where句に適切なフィルターを追加し、テーブル名の前にスキーマを追加して、別のスキーマで機能するようにします。)

    実際に機能するSQLFiddle: http://sqlfiddle.com/#!4/b67fc/1 (これが実際にSQLFiddleで機能したとは信じられません。)この場合、SQLFiddleではSELECTしか許可されていないため、目的のクエリはスキーマ定義で終了します。 クエリで。

    幸運を。あなたはそれを必要とするでしょう。足を撃たないでください。




    1. データベースフィールドエラーCodeIgniterを更新する

    2. グループSQL別の累計(Oracle)

    3. テーブル内の連続した重複をカウントする方法は?

    4. 通貨値のORDERBY