Несколько операций с использованием WITH

16

Есть ли способ выполнить несколько операций с помощью WITHоператора?

Что-то вроде

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

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

Я хочу выбрать некоторые данные и их количество ...

BrunoLM
источник

Ответы:

17

Вы можете иметь только одно заявление после CTE. Однако вы можете определить последующие CTE на основе предыдущего:

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

Учитывая, что вы пытаетесь подсчитать строки и заполнить курсор ref из того же набора результатов, может быть более целесообразно выполнить одно из следующих действий:

  • создать вид
  • этап временные результаты в таблице временных

Наконец, если запрос достаточно прост, просто запишите его один раз для подсчета и еще раз для курсора. В этом случае простота и удобочитаемость превосходят принцип СУХОГО .

Ник Чаммас
источник
10

Нет, CTE или withпредложение определяется в рамках одного оператора

Иногда вы можете сделать больше, чем ожидаете, с помощью одного оператора, например:

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

«Обычный» способ Oracle хранить временные наборы результатов (если вам нужно) - использовать таблицу GTT :
GLOBAL TEMPORARY
.

Джек Дуглас
источник