sql >> Base de Datos >  >> RDS >> Oracle

Combinando 2 si bloque y creando consulta única

(NOTA:este código no ha sido probado y puede que no tenga una coma aquí o un paréntesis allá...)

Esos dos bloques parecen diferir solo en la columna de acción y una combinación, por lo que podría eliminar las 2 piernas IF y mover la verificación de p_update_mode a una declaración CASE como esta:

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;

La consulta en su bloque COMPLETO dice que no deberíamos unirnos a B en este modo. Entonces, la cláusula LEFT JOIN solo trae filas cuando está en modo INCREMENTAL, pero no debe producir filas para el modo COMPLETO.

Esta debe ser una unión IZQUIERDA o es posible que no obtengamos ninguna fila de su vista de datos que no corresponda a las entidades en B para el modo COMPLETO. En otras palabras, si esto siguiera siendo un JOIN normal, su consulta general obtendría cero filas en modo COMPLETO debido a la cláusula AND en el enlace.

Por último, el filtro AND en la cláusula WHERE en la parte inferior se vuelve necesario ahora que hay un LEFT JOIN. Sin esto, cuando se ejecuta en modo INCREMENTAL, obtendría CADA fila en su data_view INDEPENDIENTEMENTE de que haya una fila de entidad correspondiente en B o no. A pesar de que se está uniendo en entidad_id, la combinación izquierda traerá una fila para cada fila en T incluso sin una fila coincidente en B, porque para eso se diseñaron las UNIONES IZQUIERDAS.

Dicho todo esto, tendrás que decidir si vale la pena mezclar estos dos bloques. Solo porque PUEDES, no significa que DEBES. Tu rendimiento puede ser mejor si lo dejas como lo tienes; haz algunas pruebas. Solo usted conoce el volumen de datos y la frecuencia de procesamiento. También debe considerar el mantenimiento de su código, ya que el próximo chico/chica tendrá que averiguar qué está pasando aquí.