0

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

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;    

结尾;

4

2 回答 2

1

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

于 2013-06-03T11:10:08.990 回答
1

每当您收到您不理解的 Oracle 错误消息时,首先要做的是查找含义。一种方法是简单地谷歌它。在这种情况下, Oracle9i 数据库错误消息中的完整描述是:

ORA-01791 不是 SELECTed 表达式

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

行动:从 SELECT 列表中删除不适当的 ORDER BY 项目,然后重试该语句。

(奇怪的是,此错误消息并未记录在 10G 或 11G 手册中,尽管仍在提出!)

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

如果您考虑一下,您所要求的没有意义:通过选择不包括 sam.stoptime 的 DISTINCT 值(例如),您可能会合并许多具有不同 sam.stoptime 值的行,那么哪一个会管理排序?

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

于 2013-06-03T11:11:03.843 回答