opérations multiples en utilisant AVEC
Question
Est-il possible d'exécuter plusieurs opérations en utilisant 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 le nombre de celui-ci ...
La solution
Vous ne pouvez avoir une instruction après la CTE. Vous pouvez cependant définir CTEs suivantes 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 remplir un curseur ref du même jeu de résultats, il peut être plus approprié de faire une des opérations suivantes:
- créer une vue
- Résultats de l'étape temporaire dans une table temporaire
Enfin, si la requête est assez simple, il suffit d'écrire une fois pour le compte et encore pour le curseur. La simplicité et l'emporter sur la lisibilité du principe Dry dans ce cas.
Autres conseils
Non, une clause CTE ou with
est défini dans le cadre d'une seule instruction
Parfois, vous pouvez faire plus que vous pouvez vous attendre avec une seule instruction que, 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 façon dont Oracle « normale » pour stocker les jeux de résultats temporaires (si vous devez) est d'utiliser un GTT:
table GLOBAL TEMPORARY
.