web-dev-qa-db-fra.com

Opérations multiples avec WITH

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

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 ...

16
BrunoLM

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 SEC dans ce cas.

17
Nick Chammas

Non, une clause CTE ou with est définie dans le cadre d'une seule instruction

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 un GTT:
GLOBAL TEMPORARY table
.