Várias operações usando WITH

16

Existe uma maneira de executar várias operações usando a WITHinstrução?

Algo como

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

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

Quero selecionar alguns dados e a contagem deles ...

BrunoLM
fonte

Respostas:

17

Você só pode ter uma declaração após o CTE. No entanto, você pode definir CTEs subsequentes com base em um anterior:

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

Como você está tentando contar as linhas e preencher um cursor ref a partir do mesmo conjunto de resultados, pode ser mais apropriado fazer o seguinte:

  • criar uma vista
  • Estágio Resultados Temporários em uma Tabela Temp

Por fim, se a consulta for bastante simples, basta escrevê-la uma vez para a contagem e novamente para o cursor. Simplicidade e legibilidade superam o princípio DRY neste caso.

Nick Chammas
fonte
10

Não, uma CTE ou withcláusula é definida no escopo de uma única instrução

Às vezes, você pode fazer mais do que poderia esperar com uma única declaração, por exemplo:

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

O Oráculo maneira 'normal' para armazenar conjuntos de resultados temporários (se você tiver que) é usar um GTT:
GLOBAL TEMPORARYmesa
.

Jack Douglas
fonte