Oracle
 sql >> база данни >  >> RDS >> Oracle

Комбиниране на 2 блока if и създаване на единична заявка

(ЗАБЕЛЕЖКА:този код не е тестван и може да съм извън запетая тук или скоба там...)

Тези два блока изглежда се различават само в колоната за действие и съединението, така че можете да елиминирате 2-те крака IF и да преместите проверката на p_update_mode в оператор CASE като този:

CREATE OR REPLACE PROCEDURE update_dynamic_entity(p_entity_type VARCHAR2 DEFAULT NULL,
                                                  p_update_mode VARCHAR2) IS
BEGIN
  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 lower(p_update_mode)
             WHEN 'incremental' THEN
               CASE
                 WHEN t.creation_date > b.max_last_update_date THEN
                   'update'
                 WHEN t.creation_date < b.max_last_update_date THEN
                   'add'
               END
             WHEN 'full' THEN
              'add' 
           END action
      FROM data_view t
           LEFT JOIN batch_run_details b
                  ON b.entity_type = t.entity_type
                 AND lower(p_update_mode )='incremental'
     WHERE (upper(p_entity_type) = t.entity_type OR p_entity_type IS NULL)
       AND (lower(p_update_mode) = 'full'
            OR (lower(p_update_mode) = 'incremental' AND b.entity_type IS NOT NULL)
           );
        
END update_dynamic_entity;

Заявката във вашия блок FULL казва, че не трябва да се присъединяваме към B в този режим. Така че клаузата LEFT JOIN връща редове само когато е в режим INCREMENTAL, но не трябва да произвежда редове за режим FULL.

Това трябва да е ЛЯВО съединение или може да не получим никакви редове от вашия data_view, които не съответстват на обекти в B за режим FULL. С други думи, ако това остане обикновен JOIN, цялостната ви заявка ще получи нула редове в режим FULL поради клаузата AND в съединението.

И накрая, филтърът AND в клаузата WHERE в долната част става необходим сега, когато има LEFT JOIN. Без това, когато работите в режим INCREMENTAL, ще получите ВСЕКИ ред във вашия data_view НЕЗАВИСИМО дали има съответен ред на обект в B или не. Въпреки че се присъединявате към entity_id, лявото съединение ще върне ред обратно за всеки ред в T дори без съответстващ ред в B, защото това е, което LEFT JOINs са предназначени да правят.

Всичко казано дотук, ще трябва да решите дали си струва да смесите тези два блока. Това, че МОЖЕШ, не означава, че ТРЯБВА. Представянето ви може да е по-добро, ако го оставите така, както го имате – направете някои тестове. Само вие знаете обема на данните и честотата на обработка. Трябва също така да обмислите поддръжката на вашия код, тъй като следващият човек/момиче ще трябва да разбере какво става тук.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изчаквате изпратена задача да завърши в Oracle PL/SQL?

  2. как да отпечатам цялата таблица с помощта на анонимен блок в pl sql?

  3. как да промените разделителя в sqlplus в oracle 11g

  4. Проверки на валидна дата в Oracle

  5. Как да отпечатам триъгълник от звезди с помощта на SQL