2016-07-06 83 views
1

我是子查询保理子句的忠实粉丝。oracle 12c使用子查询保理子句与plsql声明

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; 

回答

3

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

enter image description here

plsql_declarations
enter image description here

subquery_factoring_clause enter image description here

正如你看到的,语法是:

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;