如何在Oracle Select语句的子句中具有函数定义和子查询?

时间:2018-08-08 00:08:30

标签: oracle oracle12c

我知道在WITH子句中具有函数定义的正确语法。我知道在WITH子句中有子查询的正确语法。但是我无法找到在WITH语句的SELECT子句中有子查询 的示例。

如果我有

with totals as ( select colum_name from some_table )
select sum(column_name) from totals;

如何在WITH子句中添加函数定义?

2 个答案:

答案 0 :(得分:1)

由于您在Oracle上找不到太多/任何相关内容,因此我认为使用它不是一个好主意。无论如何,这适用于18.1:

WITH FUNCTION with_plus(p IN NUMBER) RETURN NUMBER IS BEGIN RETURN p + 1; END; FUNCTION with_min(p IN NUMBER) RETURN NUMBER IS BEGIN RETURN p - 1; END; qry1 AS ( SELECT with_plus(10) plus FROM DUAL ), qry2 AS ( SELECT plus, with_min(10) min FROM qry1 ) SELECT * FROM qry2 ; /

所以不要忘记斜杠/。

如果您发现了如何将整个块放入子查询中,请告诉我

答案 1 :(得分:0)

我认为没有任何限制。但是,我怀疑您的问题与列别名有关。这是对我有用的东西:

with totals as (select sum(column_name) c1 from some_table)
select c1 from totals;

Oracle可能因为您试图做类似的事情而抱怨:

with totals as (select sum(column_name) from some_table)
select sum(column_name) from totals;

不幸的是,这是名称解析的结果。子查询的列将命名为“ sum(column_name)”。由于sum是一个函数,因此如果没有Oracle认为您正在引用该函数,则无法引用该列名。您必须给它起另一个名字,以便在其他任何地方引用它。

编辑:似乎您想要定义一个函数,就像您要查看子查询一样。我认为这样的事情是不可能的。查看子查询实际上仅执行文本替换。

PL / SQL函数需要完全不同的解析器,名称解析,编译过程等。仅在查询中使用它们就足够了。

很抱歉,但是您必须正常定义包/过程/功能。