使用 WITH 的多个操作

Bru*_*oLM 16 oracle cte select

有没有办法使用WITH语句执行多个操作?

就像是

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

  SELECT COUNT(*) INTO P_OUTCOUNT FROM T;
END;
Run Code Online (Sandbox Code Playgroud)

我想选择一些数据和它的计数...

Nic*_*mas 17

在 CTE 之后只能有一个语句。但是,您可以根据前一个 CTE 定义后续 CTE:

WITH t1 AS (
   SELECT a, b, c
   FROM table1
)
, t2 AS (
   SELECT b
   FROM t1
   WHERE a = 5
)
SELECT *
FROM t2;
Run Code Online (Sandbox Code Playgroud)

鉴于您正在尝试计算行数并从同一结果集中填充引用游标,执行以下操作之一可能更合适:

  • 创建视图
  • 在临时表中暂存临时结果

最后,如果查询足够简单,只需为计数编写一次,为游标编写一次。在这种情况下,简单性和可读性胜过DRY原则。


Jac*_*las 10

否,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;
Run Code Online (Sandbox Code Playgroud)

存储临时结果集的“正常”Oracle 方法(如果必须)是使用GTT:
GLOBAL TEMPORARYtable