Mehrere Operationen mit WITH

16

Gibt es eine Möglichkeit, mehrere Operationen mit der WITHAnweisung auszuführen ?

Etwas wie

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

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

Ich möchte einige Daten und deren Anzahl auswählen ...

BrunoLM
quelle

Antworten:

17

Sie können nur eine Anweisung nach dem CTE haben. Sie können jedoch nachfolgende CTEs basierend auf einem vorherigen definieren:

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

Angesichts der Tatsache, dass Sie versuchen, die Zeilen zu zählen und einen ref-Cursor aus derselben Ergebnismenge zu füllen, ist es möglicherweise sinnvoller, einen der folgenden Schritte auszuführen:

  • Erstellen Sie eine Ansicht
  • Stellen Sie temporäre Ergebnisse in eine temporäre Tabelle

Wenn die Abfrage einfach genug ist, schreiben Sie sie einfach einmal für die Zählung und noch einmal für den Cursor. Einfachheit und Lesbarkeit trumpfen in diesem Fall das DRY- Prinzip auf.

Nick Chammas
quelle
10

Nein, ein CTE oder eine withKlausel wird im Rahmen einer einzelnen Anweisung definiert

Manchmal können Sie jedoch mit einer einzelnen Anweisung mehr tun, als Sie vielleicht erwarten:

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

Die "normale" Oracle-Methode zum Speichern temporärer Ergebnismengen (falls erforderlich
GLOBAL TEMPORARY
) ist die Verwendung einer GTT: -Tabelle .

Jack Douglas
quelle