Oracle 18c单查询WITH子句含多内联函数与多CTE的语法
Oracle 18c 单查询WITH子句同时使用多个内联函数与CTE的正确语法
Oracle 18c及以上版本支持WITH子句内同时声明内联PL/SQL函数和CTE,语法遵循固定顺序规则:
- 所有内联函数的声明必须放在所有CTE声明之前,函数和CTE不能交叉穿插书写
- 相邻的函数、CTE声明之间用半角逗号分隔
- 最后一个声明项(函数或CTE)末尾不要加逗号,直接衔接主查询语句即可
你给出的几段定义组合后的完整可运行示例如下(注:原示例中函数名存在拼写笔误,将function错写为fucntion,下方示例已做修正,如需保留原拼写直接替换函数名即可):
WITH -- 第一个内联函数 FUNCTION function1(num IN NUMBER) RETURN NUMBER IS BEGIN RETURN num + 1; END; -- 逗号分隔第二个内联函数 FUNCTION function2(num IN NUMBER) RETURN NUMBER IS BEGIN RETURN num + 2; END; -- 逗号分隔第一个CTE cte AS (SELECT 1 AS val FROM dual), -- 逗号分隔第二个CTE cte2 AS (SELECT 2 AS val FROM dual) -- 主查询部分,可直接调用前面定义的函数、引用CTE SELECT function1(cte.val) AS calc_res1, function2(cte2.val) AS calc_res2 FROM cte CROSS JOIN cte2;
常见语法错误避坑:
- 不要把CTE写在内联函数之前,否则会触发
ORA-32034: WITH子句中存在不支持的结构报错 - 声明项之间不要漏写逗号,也不要在最后一个声明项末尾多写逗号,否则会触发
ORA-00933: SQL命令未正确结束类报错 - 内联函数本身的PL/SQL语法要合规,保证BEGIN/END块完整、参数与返回值类型声明正确
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

