Dado que está utilizando Oracle, crearía las funciones de MESA Pipeline. La función toma parámetros y devuelve un objeto (que debe crear) y luego SELECCIONA * o incluso columnas específicas a partir de él utilizando la función TABLE() y puede usarlo con una cláusula WHERE o con JOINs. Si desea una unidad de reutilización (una función), no está limitado a devolver solo valores (es decir, una función escalar), puede escribir una función que devuelva filas o conjuntos de registros. algo como esto:
FUNCTION RETURN_MY_ROWS(Param1 IN type...ParamX IN Type)
RETURN PARENT_OBJECT PIPELINED
IS
local_curs cursor_alias; --you need a cursor alias if this function is in a Package
out_rec ROW_RECORD_OF_CUSTOM_OBJECT:=ROW_RECORD_OF_CUSTOM_OBJECT(NULL, NULL,NULL) --one NULL for each field in the record sub-object
BEGIN
OPEN local_curs FOR
--the SELECT query that you're trying to encapsulate goes here
-- and it can be very detailed/complex and even have WITH() etc..
SELECT * FROM baseTable WHERE col1 = x;
-- now that you have captured the SELECT into a Cursor
-- here you put a LOOP to take what's in the cursor and put it in the
-- child object (that holds the individual records)
LOOP
FETCH local_curs --opening the ref-cursor
INTO out_rec.COL1,
out_rec.COL2,
out_rec.COL3;
EXIT WHEN local_curs%NOTFOUND;
PIPE ROW(out_rec); --piping out the Object
END LOOP;
CLOSE local_curs; -- always do this
RETURN; -- we're now done
END RETURN_MY_ROWS;
después de que hayas hecho esto, se puede utilizar como tal
SELECT * FROM TABLE(RETURN_MY_ROWS(val1, val2));
puede insertar SELECT o incluso crear TABLA fuera de él, se puede tener en une .
dos más cosas que mencionar:
--ROW_RECORD_OF_CUSTOM_OBJECT is something along these lines
CREATE or REPLACE TYPE ROW_RECORD_OF_CUSTOM_OBJECT AS OBJECT
(
col1 type;
col2 type;
...
colx type;
);
y PARENT_OBJECT es una tabla del otro objeto (con las definiciones de campo) que acaba de hacer
create or replace TYPE PARENT_OBJECT IS TABLE OF ROW_RECORD_OF_CUSTOM_OBJECT;
por lo que esta función necesita dos objetos para apoyar pero uno es un registro, el otro es una tabla de ese registro (primero debe crear el registro).
En pocas palabras, la función es fácil de escribir, necesita un objeto secundario (con campos) y un objeto principal que albergará ese objeto secundario que es del tipo TABLE del objeto secundario y abre el original tabla base que busca SQL en SYS_REFCURSOR (que puede necesitar alias) si está en un paquete y lee desde ese cursor desde un bucle en los registros individuales. La función devuelve un tipo de PARENT_OBJECT pero dentro de él empaqueta el subobjeto de registros con los valores del cursor.
Espero que esto funcione para usted (puede haber problemas de la concesión de permisos con su DBA si desea crear objetos y funciones de tabla) */
Bueno, pero me gustaría manejar artículos únicos a horrible_query_1 diferente que yo manejo los elementos exclusivos de ugly_query_2. ¿Es posible decir con qué conjunto de elementos son únicos con esta consulta? EDITAR: las vistas pueden ser la mejor solución para SQL simple. – Buttons840
Claro, ajuste sus operaciones de dos conjuntos en consultas externas con selecciones que incluyen columnas fijas llamadas Fuente, es decir, 'SELECT 'horrible_query_1' Fuente AS, *' y 'SELECT 'ugly_query_2' Fuente AS, *'. De esa forma, su UNION le dará todas las columnas de su consulta más el identificador de origen. – JamieSee
El último ejemplo, utilizando las "cláusulas with" ha sido muy útil a lo largo de los años desde que originalmente hice esta pregunta. Estas "cláusulas con" a veces se denominan expresiones de tablas comunes (o CTE). Estos son algunos términos útiles que debe conocer al buscar más detalles. Las cláusulas with se agregaron al estándar SQL en 1999, por lo que la mayoría de las bases de datos deberían admitirlas, a excepción de MySQL, que aún no ha implementado esta parte del estándar de hace veinte años. – Buttons840