2012-02-24 23 views
2

私は、SQL Devツールを使用して、Oracle 11g DBを使用しています。
Collect関数を 'Distinct'句とともに使用することができません。私の手技で使用されたとき、それは認識していません!参照用Oracle 11g and Collect Function

マイクエリ:

ここで varchar2_ntt
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, '') 

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

* collect関数を使用できません*は有効なOracleエラーメッセージではありません。 「うまくいかない」とは何か?エラーメッセージとは何ですか? –

+0

VARCHAR2_NTTはパッケージ内のSQL型またはPL/SQL型として宣言されていますか? – Ollie

+0

"エラー(49,6):PL/SQL:ORA-30482:DISTINCTオプションはこの機能では使用できません"これはエラーです。上記のクエリでproceudreをコンパイルします。また、VARCHAR @ _NTTは次のように定義されています。 "TYPE varchar2_nttを作成または置換するAS TABLE OF VARCHAR2(4000);" – user1230047

答えて

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 

内部のグループbyは、「distinct」操作を実行します。

1

これは、SQLとPL/SQLエンジンのパーサーが異なるOracleの古い問題です。この場合、PL/SQLは集合関数内でdistinctを使用できません。これに関して2003年からthis AskTomの回答を参照してください。

彼のアドバイスは、動的に開いた参照カーソルを使用することです。他の解決策は、(グレンの答えのような)外部クエリでクエリをラップすることです、または私の好み、それをビューに変えて、代わりにそれから選択してください。このような状況では、動的SQLを使用することもできます。