it-swarm.dev

Wiele operacji za pomocą Z

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

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ę ...

16
BrunoLM

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ść przebijają zasadę DRY w tym przypadku.

17
Nick Chammas

Nie, zdefiniowano klauzulę CTE lub withw ramach 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;

„Normalnym” sposobem Oracle do przechowywania tymczasowych zestawów wyników (jeśli trzeba) jest użycie GTT:
GLOBAL TEMPORARY table
.