web-dev-qa-db-ja.com

WITHを使用した複数の操作

WITHステートメントを使用して複数の操作を実行する方法はありますか?

何かのようなもの

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

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

いくつかのデータとその数を選択したい...

16
BrunoLM

CTEの後に記述できるのは1つだけです。ただし、前のCTEに基づいて後続のCTEを定義できます。

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

行をカウントし、同じ結果セットからrefカーソルを生成しようとしている場合、次のいずれかを実行する方が適切な場合があります。

  • ビューを作成する
  • 一時テーブルを一時テーブルにステージングする

最後に、クエリが単純な場合は、カウント用に1回、カーソル用にもう一度記述します。この場合、シンプルさと読みやすさが [〜#〜] dry [〜#〜] の原則よりも優先されます。

17
Nick Chammas

いいえ、CTEまたはwith節が定義されています 単一のステートメントのスコープ内

ただし、単一のステートメントで予想以上のことができる場合もあります。

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

一時的な結果セットを格納する「通常の」Oracleの方法(必要な場合)は GTT:
GLOBAL TEMPORARYテーブル