Opérations multiples avec WITH

16

Existe-t-il un moyen d'exécuter plusieurs opérations à l'aide de l' WITHinstruction?

Quelque chose comme

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

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

Je veux sélectionner des données et leur nombre ...

BrunoLM
la source

Réponses:

17

Vous ne pouvez avoir qu'une seule déclaration après le CTE. Vous pouvez cependant définir des CTE ultérieurs sur la base d'un précédent:

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

Étant donné que vous essayez de compter les lignes et de remplir un curseur ref à partir du même jeu de résultats, il peut être plus approprié d'effectuer l'une des opérations suivantes:

  • créer une vue
  • afficher les résultats temporaires dans une table temporaire

Enfin, si la requête est assez simple, il suffit de l'écrire une fois pour le compte et de nouveau pour le curseur. La simplicité et la lisibilité l' emportent sur le principe DRY dans ce cas.

Nick Chammas
la source
10

Non, un CTE ou une withclause est défini dans le cadre d'une seule déclaration

Parfois, vous pouvez faire plus que ce à quoi vous vous attendez avec une seule instruction, par exemple:

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

La méthode Oracle «normale» pour stocker les jeux de résultats temporaires (si vous le devez) consiste à utiliser une table GTT :
GLOBAL TEMPORARY
.

Jack Douglas
la source