Múltiples operaciones usando WITH


16

¿Hay alguna manera de ejecutar múltiples operaciones usando la WITHdeclaración?

Algo como

WITH T AS
(
  SELECT * FROM Tbl
)
BEGIN
  OPEN P_OUTCURSOR FOR
    SELECT * FROM T;

  SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;

Quiero seleccionar algunos datos y el recuento de ellos ...

Respuestas:


17

Solo puede tener una declaración después del CTE. Sin embargo, puede definir CTE posteriores en función de uno anterior:

WITH t1 AS (
   SELECT a, b, c
   FROM table1
)
, t2 AS (
   SELECT b
   FROM t1
   WHERE a = 5
)
SELECT *
FROM t2;

Dado que está intentando contar las filas y llenar un cursor de referencia desde el mismo conjunto de resultados, puede ser más apropiado realizar una de las siguientes acciones:

  • crear una vista
  • resultados temporales de la etapa en una tabla temporal

Finalmente, si la consulta es lo suficientemente simple, solo escríbala una vez para el conteo y nuevamente para el cursor. La simplicidad y la legibilidad triunfan sobre el principio DRY en este caso.


10

No, un CTE o withcláusula se define dentro del alcance de una sola declaración

Sin embargo, a veces puede hacer más de lo que podría esperar con una sola declaración, por ejemplo:

with w as (select v from t3)
insert all into t1(v) values(v)
           into t2(v) values(v)
select v from w;

El Oracle forma 'normal' para almacenar conjuntos de resultados temporales (si es necesario) es utilizar un GTT:
GLOBAL TEMPORARYtabla
.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.