PL / SQL:ORA-30485:窗口规范中缺少ORDER BY表达式

时间:2016-11-15 20:44:26

标签: oracle plsql

我正在编译这个函数,但在窗口规范

中得到了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;

我不知道为什么会收到此错误,请帮我解决此错误

1 个答案:

答案 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 nullorder by 1也应该有用;但是你可能想要一个特定的字段或字段来排序。

换句话说,在Row_number窗口函数中,order by不是可选的。

Doc Link ” ... ROW_NUMBER是一个分析函数。它为应用它的每一行(分区中的每一行或查询返回的每一行)分配一个唯一的编号,在order_by_clause 中指定的有序行序列中,从1开始......“

这意味着没有订单,不能分配行号。