it-swarm.it

Operazioni multiple usando WITH

C'è un modo per eseguire più operazioni usando l'istruzione WITH?

Qualcosa di simile a

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

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

Voglio selezionare alcuni dati e il loro conteggio ...

16
BrunoLM

Puoi avere solo un'istruzione dopo il CTE. È possibile, tuttavia, definire i CTE successivi in ​​base a uno precedente:

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

Dato che si sta tentando di contare le righe e popolare un cursore ref dallo stesso set di risultati, potrebbe essere più appropriato eseguire una delle seguenti operazioni:

  • creare una vista
  • mette in scena risultati temporanei in una tabella temporanea

Infine, se la query è abbastanza semplice, basta scriverla una volta per il conteggio e di nuovo per il cursore. Semplicità e leggibilità vincono il principio DRY in questo caso.

17
Nick Chammas

No, è definita una clausola CTE o withnell'ambito di una singola istruzione

A volte puoi fare più di quanto potresti aspettarti con una singola istruzione, ad esempio:

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

Il modo "normale" di Oracle di archiviare set di risultati temporanei (se necessario) è utilizzare un GTT:
GLOBAL TEMPORARY tabella
.