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

Oracle:行タイプデータを別のテーブルに挿入します

    1行挿入するには-

    DECLARE
       v_record event%rowtype;
    BEGIN 
       SELECT * INTO v_record from event where rownum=1; --or whatever where clause
       Insert into tmp_event values v_record;
    END;
    

    または、eventからすべての行を挿入するためのより複雑なバージョン -

    DECLARE
      TYPE t_bulk_collect_test_tab IS TABLE OF event%ROWTYPE;
    
      l_tab t_bulk_collect_test_tab;
    
      CURSOR c_data IS
        SELECT *
        FROM event;
    BEGIN
      OPEN c_data;
      LOOP
        FETCH c_data
        BULK COLLECT INTO l_tab LIMIT 10000;
        EXIT WHEN l_tab.count = 0;
    
        -- Process contents of collection here.
        Insert into tmp_event values v_record;
      END LOOP;
      CLOSE c_data;
    END;
    /
    

    トリガーでは、はい、それは可能ですが、それは鶏が先か卵が先かです。 rowtypeのすべてのフィールドを初期化する必要があります :newを使用 次のような列の値-

    v_record.col1 := :new.col1;
    v_record.col2 := :new.col2;
    v_record.col3 := :new.col3;
    ....
    

    明らかに、上記のPLSQLの例は、変更トリガーエラーをスローするため、トリガーで使用できません。また、上記で説明したように、各列に個別にアクセスする以外に、トリガーで行全体を取得する方法はありません。したがって、これらすべてを行う場合は、:new.colを直接使用しないでください。 INSERT into temp_event それ自体、多くの作業を節約できます。

    また、すべての列に言及するのは大変な作業だと言っているので( Oracle 11gR2 ) )INSERTを生成することで、これを簡単に行う方法は次のとおりです。 ステートメントとそれを動的に実行します(ただし、パフォーマンスはテストされていません)。

    CREATE OR REPLACE TRIGGER event_air --air stands for "after insert of row"
    AFTER INSERT ON EVENT
    FOR EACH ROW
       L_query varchar2(2000);   --size it appropriately
    BEGIN
    
       SELECT 'INSERT INTO tmp_event VALUES ('|| listagg (':new.'||column_name, ',') 
                                               WITHIN GROUP (ORDER BY column_name) ||')' 
         INTO l_query
         FROM all_tab_columns
        WHERE table_name='EVENT';
    
       EXECUTE IMMEDIATE l_query;
    
    EXCEPTION
        WHEN OTHERS THEN
            --Meaningful exception handling here
    END;
    


    1. 2つの左外部結合が機能しないOracleSQL

    2. ZF2-単語全体の検索のためのMySQL正規表現

    3. java.sql.SQLException:コネクタ8.0.11のサーバーから受信した不明な初期文字セットインデックス「255」

    4. mysqldumpを使用してGEOMETRY列を持つテーブルをバックアップしますか?