¿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!
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:
Podrías crear una vista temporal y realizar operaciones en ella:
Entonces podrías hacer: