ORA-01791 Pl-Sql错误

时间:2013-06-03 10:50:37

标签: oracle plsql distinct

嗨,我有一个查询,给我以下错误:

ORA-01791: not a SELECTed expression   

这是选择表达式,请你告诉我为什么?

declare

 freqLettura varchar2(64);
 billingcy  varchar2(64);

begin
freqLettura := null;
billingcy := null;

for rec in ( select distinct(fn_get_facilityid(z.uidfacility) ) as a, 1 as b 
            from facilityhistory z, 
            locality l , 
            plant p , 
            ztmp_sam_tb_sdv zsdv , 
            ztmp_sam_tb_plantcode zplant , 
            sam_tb_ca_pdr sam,  
            meterhistory mh, 
            meter m , 
            meterclass mc 
            where 
                Z.UIDLOCALITY = L.UIDLOCALITY and  
                p.UIDPLANT = L.UIDPLANT  and 
                z.uidaccount = zsdv.uidaccount and 
                p.plantcode = zplant.plantcode and   
                sam.uidfacility = z.uidfacility and
                z.stoptime is null and
                sam.status = 'U' and
                mh.uidfacility = z.uidfacility and 
                mh.uidmeter = m.uidmeter and 
                m.uidmeterclass = mc.uidmeterclass and 
                (billingcy is null or p.UIDBILLINGCYCLE = billingcy )
            AND
            (
                (
                (freqLettura = 'G') AND   ( mh.corrmeterid is not null and mh.stoptime is null and mc.maxflowmeter >= SAM_FN_GET_PARAMETER_FLOAT('MAXFLOWMET_DETT_GIORN'))
                )
                OR
                (
                nvl(freqLettura,'nullo') <> 'G' AND (freqLettura is null or sam.readfrequency = freqLettura)
                )
            ) and ROWNUM = 1 order by sam.stoptime, sam.uidsamtbpdr desc ) loop
begin
    insert into ztmp_sam_tb_elab_pdr (facilityid, uidbatchrequest) VALUES  (rec.a, rec.b);
exception
     when dup_val_on_index then
        null;
  end;
end loop;    

端;

2 个答案:

答案 0 :(得分:1)

如果您在DISTINCT查询中使用SELECT,那么您的ORDER BY子句应仅包含您选择的列。在这种情况下,sam.stoptime, sam.uidsamtbpdr声明中没有SELECT。您可以删除ORDER BY子句,因为它在您的示例中没有做任何有用的事情。

答案 1 :(得分:1)

每当您收到您不理解的Oracle错误消息时,首先要做的就是查找含义。一种方法就是谷歌。在这种情况下, Oracle9i Database Error Messages中的完整说明是:

  

ORA-01791不是SELECTed表达式

     

原因:订单不正确   按项目。该查询是带有ORDER BY子句的SELECT DISTINCT查询。   在此上下文中,所有ORDER BY项必须是常量SELECT列表   表达式,或操作数为常量或SELECT的表达式   列表表达式。

     

操作:从SELECT列表中删除不适当的ORDER BY项   并重试该声明。

(奇怪的是,这个错误信息没有在10G或11G手册中记录,尽管仍然被提出!)

这与您编写的语句匹配,这是一个SELECT DISTINCT查询,您尝试按照未选择的列对结果进行排序。

如果您考虑一下,您要求的内容没有意义:通过选择不包含sam.stoptime的DISTINCT值(例如),您可能正在使用sam.stoptime的不同值合并许多行,因此哪一个会管理排序?

另外,正如Noel的回答所指出的那样,无论如何都没有理由在此代码中有ORDER BY子句,所以解决方案就是删除它。