Domanda

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

Qualcosa di simile

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 conteggio di esso ...

È stato utile?

Soluzione

Si può avere solo una dichiarazione dopo il CTE. È possibile, tuttavia, definire CTE successive sulla base di un 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 compilare un cursore ref dallo stesso set di risultati, può essere più appropriato per fare una delle seguenti:

  • creare una vista
  • Risultati della tappa temporanei in una tabella temporanea

Infine, se la query è abbastanza semplice, basta scrivere una volta per il conteggio e di nuovo per il cursore. La semplicità e la leggibilità briscola il DRY principio in questo caso.

Altri suggerimenti

No, un CTE o clausola di with è definito nell'ambito di una singola istruzione

A volte si può fare di più di quanto ci si potrebbe aspettare con una singola istruzione però, 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 per memorizzare set di risultati temporanei (se si deve) è quello di utilizzare un GTT:
tavolo GLOBAL TEMPORARY
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top