es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo refactorizar el código con muchas uniones?

Tengo un paquete donde necesito hacer muchos uniones iguales (o similares) muchas veces o no hacerlas en absoluto dependiendo de los parámetros. El código a continuación está simplificado. Pero el real sería un poco más complejo. Como deseo evitar declaraciones dinámicas, pensé en crear una vista temporal y hacer operaciones en esta vista.

PROCEDURE CREATE_VIEW(id IN BINARY_INTEGER, id2 IN BINARY_INTEGER, id3 IN BINARY_INTEGER) IS
sqlCommand VARCHAR2(32000);

BEGIN
sqlCommand :=
‘CREATE OR REPLACE VIEW TMP_HELPER_VIEW AS
SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
FROM
(
SELECT ID,
IMPORT1_ID,
-1 AS IMPORT2_ID,
PROD_ID
FROM TABLE1
WHERE IMPORT1> ‘|| id1;

IF id = 123 THEN
sqlCommand := sqlCommand||
‘UNION
SELECT ID,
-1 AS IMPORT1_ID,
IMPORT2_ID,
PROD_ID
FROM TABLE2
WHERE IMPORT2 > ‘|| id2;
END IF;
sqlCommand := sqlCommand||’)’ ;
EXECUTE IMMEDIATE sqlCommand;

END CREATE_VIEW;

Con la vista puedo hacer:

SELECT ID, IMPORT1_ID, IMPORT2_ID FROM TMP_HELPER_VIEW;

En lugar de

sqlCommand :=
‘SELECT ID,
IMPORT1_ID,
-1 AS IMPORT2_ID,
PROD_ID
FROM TABLE1
WHERE IMPORT1> ‘|| id1;

IF id = 123 THEN
sqlCommand := sqlCommand||
‘UNION
SELECT ID,
-1 AS IMPORT1_ID,
IMPORT2_ID,
PROD_ID
FROM TABLE2
WHERE IMPORT2 > ‘|| id2;
END IF;

Entonces el código sería mucho más legible ya que tengo muchas funciones que usan declaraciones similares. Las declaraciones son siempre un poco diferentes, por lo que necesito escribirlas cada vez (no puedo escribir una en una función y llamarla cada vez desde allí).
Pero me pregunto si hay una solución mejor para este problema. Tal vez alguien pueda darme alguna pista.
¡Muchas gracias!

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás buscando una solución mejor para evitar escribir declaraciones dinámicas para uniones similares. Una posible solución es crear una vista temporal y realizar operaciones en esta vista. Esto haría que el código sea más legible y más fácil de mantener.

    Por ejemplo, en lugar de escribir:

    sqlCommand := 
                  'SELECT ID,
                   IMPORT1_ID,
                   -1 AS IMPORT2_ID,
                   PROD_ID                
              FROM TABLE1
              WHERE IMPORT1> '|| id1;
    
            IF id := 123 THEN    
                sqlCommand := sqlCommand||
                'UNION
                SELECT ID,
                       -1 AS IMPORT1_ID,
                       IMPORT2_ID,
                       PROD_ID               
                  FROM TABLE2
                  WHERE IMPORT2> '|| id2;
            END IF;
    

    Podrías crear una vista temporal y realizar operaciones en ella:

    PROCEDURE CREATE_VIEW( id IN BINARY_INTEGER, id2 IN BINARY_INTEGER, id3 IN BINARY_INTEGER) IS
        sqlCommand VARCHAR2(32000);
    
        BEGIN
            sqlCommand :=
            'CREATE OR REPLACE VIEW TMP_HELPER_VIEW AS 
            SELECT ID, IMPORT1_ID, IMPORT2_ID, PROD_ID
            FROM 
            (
                SELECT ID,
                       IMPORT1_ID,
                       -1 AS IMPORT2_ID,
                       PROD_ID                
                  FROM TABLE1
                  WHERE IMPORT1> '|| id1;
    
    
            IF id := 123 THEN    
                sqlCommand := sqlCommand||
                'UNION
                SELECT ID,
                       -1 AS IMPORT1_ID,
                       IMPORT2_ID,
                       PROD_ID               
                  FROM TABLE2
                  WHERE IMPORT2> '|| id2;
            END IF;
            sqlCommand := sqlCommand||')' ;
            EXECUTE IMMEDIATE  sqlCommand;                
    
    
        END CREATE_VIEW;
    

    Entonces podrías hacer:

    SELECT ID, IMPORT1_ID, IMPORT2_ID FROM TMP_HELPER_VIEW; 
    

Comments are closed.