1

我是子查询分解子句的忠实粉丝。

WITH t1 as (select 1 as id from dual)
select * from t1;

oracle 12c 现在在 WITH 子句中包含一个 PL/SQL 声明部分

WITH
  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1

但我似乎无法让他们一起工作,这可能吗?

WITH t1 as (select 1 as id from dual)
WITH  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1;
4

1 回答 1

3

请参考语法:
https ://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702

在此处输入图像描述

plsql_declarations
在此处输入图像描述

subquery_factoring_clause 在此处输入图像描述

如您所见,语法是:

WITH [ plsql_declarations ] [ subquery_factoring_clause ]

这意味着必须先执行 PL/SQL,然后执行其余的 SQL 查询,以这种方式:

WITH 
  FUNCTION with_function(p_id IN NUMBER) RETURN NUMBER IS
  BEGIN
    RETURN p_id;
  END;
t1 as (select 1 as id from dual)
SELECT with_function(id)
FROM   t1
WHERE  rownum = 1;
于 2016-07-06T19:06:35.603 回答