2017-10-12 2 views
0

J'ai cette requête pour obtenir les données d'inventaire du produit, et il doit être fait dans une colonne donc j'utilise cette requête d'agrégation de liste (info supplémentaire: Select subquery that return multiple rows as string (one column) in table (Oracle SQL)). Mais dans certaines données obtenir des erreurs: le résultat de la concaténation de chaînes est trop long. Comment optimiser cette requête et résoudre cette erreur? (J'ai besoin du changement que seul dans cette sous-requête, parce que la requête est utilisée en fonction des autres) MerciSous-requête Listagg obtenir des erreurs: résultat de concaténation de chaîne est trop long

SELECT K.PRODUCT_NO, ..., (SELECT i.OPTIONS 
    FROM PRODUCT p , ... 
    LEFT JOIN (
     SELECT ITM.PRODUCT_NO 
      ,LISTAGG(NVL2(ITM.OPTION1, ITM.OPTION1 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION2, ITM.OPTION2 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION3, ITM.OPTION3 || (chr(13)||chr(10)), '') || NVL2(ITM.OPTION4, ITM.OPTION4 || (chr(13)||chr(10)), ''), ',') WITHIN 
     GROUP (
       ORDER BY ITM.itm_no 
       ) AS OPTIONS 
     FROM ITEM ITM 
     GROUP BY ITM.PRODUCT_NO 
     ) i ON (p.PRODUCT_NO = i.PRODUCT_NO) 
    WHERE P.PRODUCT_NO = K.PRODUCT_NO) as OPTIONS, 
    (SELECT i.OPTIONS 
    FROM PRODUCT p 
    LEFT JOIN (
     SELECT ITM.PRODUCT_NO 
      ,LISTAGG(NVL2(QUANTITY, QUANTITY || (chr(13)||chr(10)), '0')) WITHIN 
     GROUP (
       ORDER BY ITM.itm_no 
       ) AS OPTIONS 
     FROM ITEM_INVENTORY ITM 
     GROUP BY ITM.PRODUCT_NO 
     ) i ON (p.PRODUCT_NO = i.PRODUCT_NO) 
    WHERE P.PRODUCT_NO = K.PRODUCT_NO) as QTY 
    from PRODUCT K 
+0

Une option serait de passer à Oracle 12cR2 qui fournit un soutien en cas de débordement de manutention [en savoir plus] (https://oracle-base.com/ articles/12c/listagg-fonctions-améliorations-12cr2 # handling-overflow-errors). Ne pas être totalement facétieux: Oracle 11g n'est pas une version activement supportée. – APC

+0

Le projet utilisant Oracle 11g et ne peut pas être mis à jour –

+0

Je soupçonnais que c'était le cas, c'est pourquoi je l'ai posté comme un commentaire pas une réponse. – APC

Répondre

0

méthode XMLAGG peut être utilisé pour les chaînes globales.

Exemple.

select rtrim(
      xmlserialize(content extract(xmlagg(xmlelement(e, object_name || ',') order by object_id), '//text()') 
         no indent) 
     , ',') 
     , object_type 
    from user_objects 
group by object_type; 

Dans votre cas, la première sous-requête ressemblera à ceci.

select ITM.PRODUCT_NO 
     , rtrim(
      xmlserialize(
      content extract(
         xmlagg(
         xmlelement(
          e 
         , nvl2(ITM.OPTION1, ITM.OPTION1 || (chr(13) || chr(10)), '') 
          || nvl2(ITM.OPTION2, ITM.OPTION2 || (chr(13) || chr(10)), '') 
          || nvl2(ITM.OPTION3, ITM.OPTION3 || (chr(13) || chr(10)), '') 
          || nvl2(ITM.OPTION4, ITM.OPTION4 || (chr(13) || chr(10)), '') 
          || ',') 
         order by ITM.itm_no) 
        , '//text()') 
      no indent) 
     , ',') 
    from ITEM ITM 
group by ITM.PRODUCT_NO 

Vous trouverez de plus amples méthode https://www.programmingmusings.com/index.php/2015/05/22/string-aggregation-in-oracle-sql/

+0

Merci pour votre solution il résout le problème. –