Wiele operacji za pomocą Z

16

Czy istnieje sposób na wykonanie wielu operacji przy użyciu WITHinstrukcji?

Coś jak

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

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

Chcę wybrać niektóre dane i ich liczbę ...

BrunoLM
źródło

Odpowiedzi:

17

Możesz mieć tylko jedną instrukcję po CTE. Możesz jednak zdefiniować kolejne CTE na podstawie poprzedniego:

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

Biorąc pod uwagę, że próbujesz policzyć wiersze i wypełnić kursor referencyjny z tego samego zestawu wyników, bardziej odpowiednie może być wykonanie jednej z następujących czynności:

  • utwórz widok
  • tymczasowe wyniki etapowe w tabeli tymczasowej

Wreszcie, jeśli zapytanie jest dość proste, po prostu napisz je raz dla liczby i ponownie dla kursora. Prostota i czytelność przewyższają w tym przypadku zasadę OSUSZANIA .

Nick Chammas
źródło
10

Nie, CTE lub withklauzula są zdefiniowane w zakresie pojedynczej instrukcji

Czasami możesz zrobić więcej, niż możesz się spodziewać za pomocą jednego polecenia, np .:

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

„Normalne” Oracle sposób na przechowywanie tymczasowe tabele wynikowe (jeśli trzeba) jest użycie GTT:
GLOBAL TEMPORARYstołowego
.

Jack mówi, że spróbuj topanswers.xyz
źródło