[ERRO] ORA-01489: result of string concatenation is too long

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
Avatar do usuário
Anderrssoon
Rank: Programador Júnior
Rank: Programador Júnior
Mensagens: 20
Registrado em: Qui, 15 Mar 2012 7:34 am

Bom dia pessoal, vamos a meu primeiro post no fórum.
Estou com o seguinte problema pessoal, estou executando o código:

Selecionar tudo

SELECT   PP_CODIGO,
                           LTRIM (MAX (SYS_CONNECT_BY_PATH (EQ_TAG, ',  ')), ',')
                              EQ_TAGS
                    FROM   (SELECT   PP_CODIGO,
                                     PP.EQ_CODIGO,
                                     EQ.EQ_TAG,
                                     ROW_NUMBER ()
                                        OVER (PARTITION BY PP.PP_CODIGO
                                              ORDER BY PP.EQ_CODIGO)
                                        rn
                              FROM   WEBUJU.SAMI_PREVENTIVA_EQUIPAMENTO PP,
                                     WEBUJU.SAMI_EQUIPAMENTO EQ
                             WHERE   PP.EQ_CODIGO = EQ.EQ_CODIGO)
              CONNECT BY   PP_CODIGO = PRIOR PP_CODIGO AND rn = PRIOR rn + 1
              START WITH   rn = 1
                GROUP BY   PP_CODIGO
E ele esta dando o seguinte erro após o código ser executado,

Selecionar tudo

ORA-01489: result of string concatenation is too long 
Alguém já passou por este problema e poderia me indicar um caminho para uma possível solução?

Abraço.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Andersoon,

Alguns pontos:

- A função SYS_CONNECT_BY_PATH sempre retorna VARCHAR2;
- Um campo VARCHAR2 apresenta a extensão máxima de 4000 posições;
- Se eu tentar inserir mais de 4000 caracteres em um campo VARCHAR2(4000), ocorrerá o erro ORA-01489;

Resumindo, a função SYS_CONNECT_BY_PATH de sua querie está tentando concatenar mais de 4000 caracteres em uma string, o que gera esta mensagem de erro.

Para sanar este problema, você pode tentar:

- Reduzir a quantidade de caracteres concatenados;
- Usar uma função TO_CLOB(texto) para armazenar os valores. Um CLOB pode armazenar bem mais de 4000.

Faça um teste :

Selecionar tudo

SELECT PP_CODIGO,
       LTRIM (MAX (SYS_CONNECT_BY_PATH (EQ_TAG, ',  ')), ',')
       EQ_TAGS
 FROM (SELECT PP_CODIGO,
              PP.EQ_CODIGO,
              TO_CLOB(EQ.EQ_TAG) AS EQ_TAG,
              ROW_NUMBER ()
              OVER (PARTITION BY PP.PP_CODIGO
                    ORDER BY PP.EQ_CODIGO)
              rn
         FROM WEBUJU.SAMI_PREVENTIVA_EQUIPAMENTO PP,
              WEBUJU.SAMI_EQUIPAMENTO EQ
        WHERE PP.EQ_CODIGO = EQ.EQ_CODIGO)
      CONNECT BY PP_CODIGO = PRIOR PP_CODIGO AND rn = PRIOR rn + 1
        START WITH rn = 1
     GROUP BY PP_CODIGO
Não sei se funcionará, mas é uma tentativa.

Abraços,

Sergio Coutinho
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 16 visitantes