Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql oracle11g和Collect函数_Sql_Oracle_Plsql - Fatal编程技术网

Sql oracle11g和Collect函数

Sql oracle11g和Collect函数,sql,oracle,plsql,Sql,Oracle,Plsql,我正在通过一个SQL开发工具使用ORACLE 11g DB。 无法将Collect函数与'Distinct'子句一起使用。在我的程序中使用时,它无法识别 我的查询供参考: SELECT nvl(spicd.company_code, '') companycode , nvl(scc.company_description, '') companydesc , nvl(spicd.plant_code, '') plantcode , CAST(COLLECT(DI

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

我的查询供参考:

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, '')
返回的错误为:

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

将其包装到子查询中如何

    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

内部group by执行distinct操作。

这是Oracle中的一个老问题,SQL和PL/SQL引擎解析器不同,在这种情况下,PL/SQL不允许在聚合函数中使用distinct。见2003年AskTom对此的回复


他的建议是使用动态打开的ref游标。其他解决方案是使用外部查询(如Glenn的答案)包装查询,或者,我更喜欢将其转换为视图并从中选择。使用动态SQL也可以在这种情况下工作。

无法使用collect函数不是有效的Oracle错误消息。到底是什么不起作用?错误消息是什么?VARCHAR2\u NTT在包中声明为SQL类型还是PL/SQL类型?错误49,6:PL/SQL:ORA-30482:此函数不允许使用DISTINCT选项…这是我在使用上述查询编译程序时遇到的错误。还有VARCHAR@_NTT定义为…创建或替换类型varchar2\u ntt作为VARCHAR24000的表;
    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