2012-02-24 199 views
2

我正在使用ORACLE 11g DB,通过SQL开发工具。
无法将Collect函数与'Distinct'子句一起使用。在我的程序中使用时,它不能识别!Oracle 11g和Collect功能

我的查询以供参考:

SELECT nvl(spicd.company_code, '') companycode 
    , nvl(scc.company_description, '') companydesc 
    , nvl(spicd.plant_code, '') plantcode 
    , CAST(COLLECT(DISTINCT svh.haulier_code) AS varchar2_ntt) hauliercode 
    , CAST(COLLECT(DISTINCT sh.hauier_name) AS varchar2_ntt) hauliername 
    FROM saistb_company_code   scc 
    , saistb_pve_indv_contact_det spicd 

    LEFT OUTER JOIN saistb_vendor_haulier svh 
    ON svh.company_code = spicd.company_code 
    AND svh.plant_code = spicd.plant_code 
    AND svh.vendor_code = spicd.vendor_code 

    LEFT OUTER JOIN saistb_haulier sh 
    ON sh.haulier_code = svh.haulier_code 

WHERE scc.company_code = spicd.company_code 
    AND spicd.company_code LIKE <<companycode>> 
    AND spicd.plant_code LIKE <<plantcode>> 

GROUP BY nvl(spicd.company_code, '') 
     , nvl(scc.company_description, '') 
     , nvl(spicd.plant_code, '') 

这里varchar2_ntt是:

create or replace TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000); 

返回的错误是:

Error(49,6): PL/SQL: ORA-30482: DISTINCT option not allowed for this function 
+0

*无法使用收集功能*不是有效的Oracle错误消息。什么“不工作”?什么是错误信息? – 2012-02-24 07:35:34

+0

将VARCHAR2_NTT声明为包中的SQL类型或PL/SQL类型? – Ollie 2012-02-24 09:12:36

+0

“错误(49,6):PL/SQL:ORA-30482:此功能不允许使用DISTINCT选项”...这是我得到的错误我使用上述查询编译过程。另外,VARCHAR @ _NTT被定义为...“创建或替换TYPE varchar2_ntt AS TABLE OF VARCHAR2(4000);” – user1230047 2012-02-27 06:12:31

回答

0

如何在一个子查询包裹呢?

SELECT companyCode, companyDesc, plantCode, 
      cast(COLLECT(haulierCode) as varchar2_ntt) haulierCode, 
      cast(COLLECT(haulierName) as varchar2_ntt) haulierName 
    FROM (

    SELECT 
    nvl(spicd.COMPANY_CODE,'') companyCode, 
    nvl(scc.COMPANY_DESCRIPTION,'') companyDesc,  
    nvl(spicd.PLANT_CODE,'') plantCode, 
    nvl(sh.HAULIER_CODE, 'UNKNOWN HAULIER CODE') haulierCode, 
    nvl(sh.haulier_name, 'UNKNOWN HAULIER NAME') haulierName 
    from 
    SAISTB_COMPANY_CODE scc, 
    SAISTB_PVE_INDV_CONTACT_DET spicd 

    left outer join SAISTB_VENDOR_HAULIER svh on 
    svh.COMPANY_CODE = spicd.COMPANY_CODE and 
    svh.PLANT_CODE = spicd.PLANT_CODE and 
    svh.VENDOR_CODE = spicd.VENDOR_CODE 

    left outer join SAISTB_HAULIER sh on 
    sh.HAULIER_CODE = svh.HAULIER_CODE 

    where 
    scc.COMPANY_CODE = spicd.COMPANY_CODE 
    and spicd.COMPANY_CODE like <<CompanyCode>> 
    and spicd.PLANT_CODE like <<PlantCode>> 

    group by 
    nvl(spicd.COMPANY_CODE,''),   
    nvl(scc.COMPANY_DESCRIPTION,''),  
    nvl(spicd.PLANT_CODE,''), 
    nvl(sh.HAULIER_CODE, 'UNKNOWN HAULIER CODE') haulierCode, 
    nvl(sh.haulier_name, 'UNKNOWN HAULIER NAME') haulierName 

    ) 

    GROUP BY companyCode, companyDesc, plantCode 

内部组通过执行“不同”操作。

1

这是Oracle中SQL和PL/SQL引擎分析程序不同的一个老问题,在这种情况下,PL/SQL不会让您在聚合函数中使用distinct。请参阅this AskTom对此的回应。

他的建议是使用动态打开的参考光标。其他的解决方案是用外部查询包装你的查询(比如Glenn的答案),或者,我的首选项将它变成一个视图并从中选择。使用动态SQL也适用于这种情况。