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

PL/SQLでのコードの最適化。適切にする。コードは実行されていますが、適切ではありません

    これは、以前のplsqlプロシージャの繰り返しコード行。より良い方法で作ろうとしている

    ここで行うのは、JOINを追加することです。 batch_run_detailsを含むテーブルへ また、creation_dateに基づいて各行に挿入する必要のあるアクションを決定するケース およびmax_last_update_date

    CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
                                                      p_update_mode VARCHAR2) IS
    BEGIN
      IF lower(p_update_mode) <> 'incremental'
      THEN
        RETURN; -- Do nothing if incorrect mode
      END IF;
      --
      INSERT INTO dynamicentitygtt
        (entity_type, entity_id, entity_code, synonyms, action)
        SELECT upper(NVL(p_entity_type, 'ITEM')),
               t.item_id,
               t.item_name,
               t.item_desc,
               CASE
                 WHEN t.creation_date > b.max_last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.max_last_update_date THEN
                   'add'
               END
          FROM itemde t
          JOIN batch_run_details b
            ON b.entity_type = 'ITEM'
         WHERE upper(p_entity_type) = 'ITEM'
            OR p_entity_type IS NULL;
      --
      INSERT INTO dynamicentitygtt
        (entity_type, entity_id, entity_code, synonyms, action)
        SELECT upper(NVL(p_entity_type, 'ORG')),
               t.org_id,
               t.org_name,
               t.org_desc,
               CASE
                 WHEN t.creation_date > b.max_last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.max_last_update_date THEN
                   'add'
               END
          FROM orgde t
          JOIN batch_run_details b
            ON b.entity_type = 'ORG'
         WHERE upper(p_entity_type) = 'ORG'
            OR p_entity_type IS NULL;
    END update_dynamic_entity;
    

    そして、前の投稿からの完成のために、シングルインサートバージョンも:

    CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
                                                      p_update_mode VARCHAR2) IS
    BEGIN
      IF lower(p_update_mode) <> 'incremental'
      THEN
        RETURN;
      END IF;
      --
      INSERT INTO dynamicentitygtt
        (entity_type, entity_id, entity_code, synonyms, action)
        WITH data_view AS
         ( -- ITEM table
          SELECT 'ITEM' entity_type, -- This separates inserted values
                  item_id data_id,
                  item_name data_name,
                  item_desc data_desc,
                  creation_date
            FROM itemde
          UNION ALL
          -- ORG table
          SELECT 'ORG' entity_type, -- This separates inserted values
                  org_id,
                  org_name,
                  org_desc,
                  creation_date
            FROM orgde
          -- NEXT entity table
          )
        SELECT upper(t.entity_type),
               t.data_id,
               t.data_name,
               t.data_desc,
               CASE
                 WHEN t.creation_date > b.max_last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.max_last_update_date THEN
                   'add'
               END
          FROM data_view t
          JOIN batch_run_details b
            ON b.entity_type = t.entity_type
         WHERE upper(p_entity_type) = t.entity_type
            OR p_entity_type IS NULL;
    END update_dynamic_entity;
    


    1. MySQL/MariaDBテーブルの現在のAuto_Incrementシーケンス番号を取得する方法

    2. Hibernateでのテーブルレベルのロック

    3. PL / SQLブロックからSELECT文を出力することはできますか?

    4. SQLServerMDFファイル回復のための迅速で最良のトリック