我知道在WITH
子句中具有函数定义的正确语法。我知道在WITH
子句中有子查询的正确语法。但是我无法找到在WITH
语句的SELECT
子句中有子查询 和 的示例。>
如果我有
with totals as ( select colum_name from some_table )
select sum(column_name) from totals;
如何在WITH
子句中添加函数定义?
答案 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函数需要完全不同的解析器,名称解析,编译过程等。仅在查询中使用它们就足够了。
很抱歉,但是您必须正常定义包/过程/功能。