我正在编译这个函数,但在窗口规范
中得到了ERROR:缺少ORDER BY表达式 CREATE OR REPLACE FUNCTION WFir_get_act_section_cd(firnum IN NUMBER,langcd IN NUMBER) RETURN VARCHAR2
as
ACTSEC VARCHAR2(1500);
BEGIN
begin
--- ERROR START
select ltrim(max(sys_connect_by_path(NVL(act_long,' ') || '/' || NVL(section,' '),',')),',') as FIR_ACT_SEC into ACTSEC from(select NVL(act_long,' ') || '/' || NVL(section,' '), row_number() over() rn from rep_fir_sections sec
INNER JOIN m_act a on sec.act_cd = a.act_cd
INNER JOIN m_section c on sec.section_cd = c.section_code
and FIR_REG_NUM = FIRNum
and a.lang_cd = langcd) WHERE ROWNUM <=1 start with rn = 1
connect by prior rn = rn -1;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
end;
return ACTSEC;
END;
当我们将这个函数从MYSQL迁移到Oracle后编译上面的函数时,我得到错误&#34;在窗口规范中缺少ORDER BY表达式&#34;
我不知道为什么会收到此错误,请帮我解决此错误
答案 0 :(得分:1)
Row_number() over ()
不正确。
order by
需要row_number才能工作。
Row_number() over (order by Null /*or you decide what field list*/)
。
要分配row_number,您必须指定order by some column
。如果您没有指定系统将它们放入的订单,则系统不知道要分配给#1的行。即使order by null
或order by 1
也应该有用;但是你可能想要一个特定的字段或字段来排序。
换句话说,在Row_number窗口函数中,order by不是可选的。
Doc Link ” ... ROW_NUMBER是一个分析函数。它为应用它的每一行(分区中的每一行或查询返回的每一行)分配一个唯一的编号,在order_by_clause 中指定的有序行序列中,从1开始......“
这意味着没有订单,不能分配行号。