ORA-06502 character string buffer too small numérico ou de valor

12/04/2023

0

na seguinte query, estou tendo um erro em uma determinado dia que nunca ocorreu: ORA-06502 character string buffer too small numérico ou de valor.
Fiz de tudo pra resolver. tentei converter a informação usnado convert, tentei to_char, mas nada funciona... Alguém consegue me ajudar?

select pac_reg Registro
      ,pac_nome Paciente ,checkcir.rcl_dthr, checkcir.rcl_txt
      ,replace(smart.f_resultado_rcl_2(relcir.rcl_laudo_tratado, 21156, 12), ''?'') Data_Cirurgia
      ,replace(replace(smart.f_resultado_rcl_2(relcir.rcl_laudo_tratado, 21155, 39), ''?''), ''Potencialmente conta'', ''Pontencialmente contaminada'') Potencial_Contaminação
      ,nvl(psv_nome, rcl_e_nome) Cirurgião
      ,ctf_nome Classe_Técnica_Proc_Principal
      ,esp_nome Especialidade_cirurgião
      ,smk_nome Procedimento_Principal
      ,decode(rcl_c_via_acesso, ''P'', ''Principal''
                              , ''N'', ''Outra via'') Via_de_acesso
      ,replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28803, 07), ''?'') Anestesista
      ,replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 26), ''?'') Ini_cir_timeout
      ,replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28806, 33), ''?'') Fim_cir_timeout  
      ,replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 09), ''?'') Antibiótico_profilático
      ,case 
         when replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 09), ''?'') = ''Sim'' then
            replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 13), ''?'') 
       end Qual_is
 

/*erro nesta coluna*/
 ,convert(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 14), ''US7ASCII'', ''WE8ISO8859P1'')
      ,case 
         when replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 09), ''?'') = ''Sim'' then
            replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 14), ''?'') 
       end Horário_1a_dose



      ,case 
         when replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 09), ''?'') = ''Sim'' then
            replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 15), ''?'') 
       end Horário_2a_dose      
      ,(select max(ism.ism_data_aplicacao)
        from   ism
              ,sma
              ,bul
              ,bpt
        where  ism_sma_serie = sma_serie
        and    ism_sma_num = sma_num
        and    bul_mat_cod = ism_mat_cod
        and    bpt_bul_med = bul_med
        and    bpt_pat_cod in (''AMS'', 
                               ''CFZ'', 
                               ''CZL'') 
        and    ism_qtde_baixa > 0
        and    sma_pac_reg = relcir.rcl_pac
        and    sma_hsp_num = relcir.rcl_hsp
        and   (ism_data_aplicacao - relcir.rcl_dthr) between 0 and 5) Últ_dose_Cefazoilna_Ampicilina
      ,(select max(ism.ism_data_aplicacao)
        from   ism
              ,sma
              ,bul
              ,bpt
        where  ism_sma_serie = sma_serie
        and    ism_sma_num = sma_num
        and    bul_mat_cod = ism_mat_cod
        and    bpt_bul_med = bul_med
        and    bpt_pat_cod in (''CXO'',
                               ''CEM'') 
        and    ism_qtde_baixa > 0
        and    sma_pac_reg = relcir.rcl_pac
        and    sma_hsp_num = relcir.rcl_hsp
        and   (ism_data_aplicacao - relcir.rcl_dthr) between 0 and 5) Últ_dose_Cefuroxima_Axetil      
      ,pac_celular Celular_paciente
      ,pac_fone Telefone_paciente
      ,(select max(nvl(to_number(replace(replace(
smart.f_resultado_rcl_2(i.rcl_txt, 39321, 1)
, ''?''), '',0'' , '''')/1000), 0)) from rcl i where pac.pac_reg = i.rcl_pac and i.rcl_cod = ''45002'') peso
		/*,to_char(relcir.rcl_dthr, ''HH24:MI:SS'') hora_entrada*/
      ,checkcir.rcl_dthr Entrada_do_Paciente_Na_Sala
      ,replace(smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28804, 18), ''?'') Inicio_inducao
			from
     (select   rcl.*
              ,case 
                 when rcl_laudo_rtf is not null and rcl_txt = ''NO_CAMPO_LAUDO_RTF'' then 
                    convertlong_to_varchar(rcl_pac, rcl_tpcod, rcl_cod, rcl_dthr, rcl_hsp)
                 else
                    rcl_txt
               end rcl_laudo_tratado
      	from     rcl) relcir
     ,(select   rcl.*
              ,case 
                 when rcl_laudo_rtf is not null and rcl_txt = ''NO_CAMPO_LAUDO_RTF'' then 
                    convertlong_to_varchar(rcl_pac, rcl_tpcod, rcl_cod, rcl_dthr, rcl_hsp)
                 else
                    rcl_txt
               end rcl_laudo_tratado
      	from     rcl where rcl_stat <> ''C'') checkcir      
     ,rcl_ecp
     ,psv
     ,esm
     ,esp
     ,rcl_crg
     ,smk
     ,ctf
     ,pac
where relcir.rcl_pac = pac_reg 
and   relcir.rcl_id = rcl_e_id 
and   rcl_e_fec_cod = ''C''
and   rcl_e_psv_cod = psv_cod 
and   psv_cod = esm_med 
and   esm_esp = esp_cod 
and   esm_default = ''S''
and   relcir.rcl_id = rcl_c_id 
and   rcl_c_via_acesso in (''P'', ''N'')
and   rcl_c_smk_tipo = smk_tipo 
and   rcl_c_smk_cod = smk_cod 
and   smk_tipo = ''S''
and   smk_tipo = ctf_tipo 
and   smk_ctf = ctf_cod 
and   smk_cod not in (''2916'',''88020903'',''88021148'',''2549'',''7330'',''8802'',''2509'',''2132'',''2382'',''7311'',''6046'',''2051'',''8801'',''31162'',''8516'',''8819'',''2290'',''8726'',''2393'',''8670'',''31640'',''32699'',''31578'',
''3117'',''2043'',''7386'',''4923'',''2234'',''2452'',''9046'',''8794'',''2107'',''2133'',''31395'',''31342'',''9032'',''31638'',''31798'',''31747'',''6807'',''31663'',''8539'',''9695'',''6779'',''9694'',''31651'',''9693'',''3383'',''2367'',
''31642'',''31582'',''2450'',''2473'',''2324'',''8740'',''2206'',''2063'',''2041'',''9406'',''31166'',''2130'',''32473'',''8727'',''31035'',''5099'',''2136'',''31534'',''31533'',''2391'',''31173'',''2355'',''2373'',''2444'',''31174'',''8671'',
''2093'',''32471'',''31661'',''2356'',''2849'',''2481'',''2908'',''88020919'',''88020730'',''8946'',''31180'',''31181'',''31182'',''31183'',''31184'')
and   relcir.rcl_cod = ''RELCIR''
and   relcir.rcl_stat not in (''C'', ''A'')
and   checkcir.rcl_pac = relcir.rcl_pac
and   checkcir.rcl_hsp = relcir.rcl_hsp
and   trunc(checkcir.rcl_dthr) = trunc(relcir.rcl_dthr)
and   checkcir.rcl_cod = ''CHECKCIR''
and   checkcir.rcl_stat not in (''C'', ''A'') 
and   relcir.rcl_dthr >=  to_date ( ''2023-03-24 08:00:00'', ''yyyy-mm-dd hh24:mi:ss'' ) 
and   relcir.rcl_dthr < to_date ( ''2023-03-24 23:59:59'', ''yyyy-mm-dd hh24:mi:ss'' )  
Isnar Filho

Isnar Filho

Responder

Posts

12/04/2023

Arthur Heinrich

Esta mensagem de erro indica que você está inserindo um valor maior do que uma variável ou coluna de tabela comportam.

Como o seu código é um select, suspeito que o erro esteja ocorrendo internamente a alguma das funções chamadas na query.

Por exemplo: convertlong_to_varchar(rcl_pac, rcl_tpcod, rcl_cod, rcl_dthr, rcl_hsp)

Não sei o que esta função faz mas, pelo nome, pode ser aqui o problema.

Se você conseguir colocar a sua query dentro de um bloco PL/SQL, com tratamento de erro, do tipo:

set serveroutput on
begin
  for row in (<query>) loop
    null;
  loop;
exception
  when others then
    dbms_output.put_line(dbms_utility.format_error_stack);
    dbms_output.put_line(dbms_utility.format_error_backtrace);
end;
/


Talvez você obtenha uma mensagem mais clara de onde o problema está ocorrendo.
Responder

13/04/2023

Isnar Filho

Oi Arthur..

deu um erro aqui
variavel de bindig "SS" não declarada
Rodei no developer do oracle, não sei se serve.

Eis o que sei até aqui:
O erro está na seguinte função:
smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 14)


Ela trata um bloco de texto gigante, algo parecido com "@#28804@13&Sim@#28804@3&Não @#28804@17&Sim@#28804@8OMANTA TÉRMICA SUPERIOR " e ele pega tudo tem entre uma determinada sequencia ex @#28804@13& e o proximo @. Inicialmente eu não identifiquei nenhum problema no momento que dá o erro, já até isolei a query na ferramenta que tenho disponível.

Esta mensagem de erro indica que você está inserindo um valor maior do que uma variável ou coluna de tabela comportam.

Como o seu código é um select, suspeito que o erro esteja ocorrendo internamente a alguma das funções chamadas na query.

Por exemplo: convertlong_to_varchar(rcl_pac, rcl_tpcod, rcl_cod, rcl_dthr, rcl_hsp)

Não sei o que esta função faz mas, pelo nome, pode ser aqui o problema.

Se você conseguir colocar a sua query dentro de um bloco PL/SQL, com tratamento de erro, do tipo:

set serveroutput on
begin
  for row in (<query>) loop
    null;
  loop;
exception
  when others then
    dbms_output.put_line(dbms_utility.format_error_stack);
    dbms_output.put_line(dbms_utility.format_error_backtrace);
end;
/


Talvez você obtenha uma mensagem mais clara de onde o problema está ocorrendo.
Responder

13/04/2023

Arthur Heinrich

Oi Arthur..

deu um erro aqui
variavel de bindig "SS" não declarada
Rodei no developer do oracle, não sei se serve.

Eis o que sei até aqui:
O erro está na seguinte função:
smart.f_resultado_rcl_2(checkcir.rcl_laudo_tratado, 28805, 14)


Ela trata um bloco de texto gigante, algo parecido com "@#28804@13&Sim@#28804@3&Não @#28804@17&Sim@#28804@8OMANTA TÉRMICA SUPERIOR " e ele pega tudo tem entre uma determinada sequencia ex @#28804@13& e o proximo @. Inicialmente eu não identifiquei nenhum problema no momento que dá o erro, já até isolei a query na ferramenta que tenho disponível.


Bom. Já avançou um pouco. Se você tem a função que apresenta o erro, precisa examinar o código e entender onde está o problema.

Com base na sua descrição, você poderia fazer a busca inicial, identificando a posição de início da string '@#28804@13&', somando o tamanho da tag pesquisada e, em seguida, localizar a posição do próximo '@'.

tag := '@#28804@13&';
inicio := instr(message, tag)+length(tag);
fim := instr(message, '@', inicio);
valor := substr(message, inicio, (fim-inicio));

No exemplo acima, provavelmente a resposta seria 'Sim'. Mas, se não podemos garantir que a mensagem esteja íntegra e que respeite certos padrões, você precisará contornar eventuais falhas.

Por exemplo, se o valor esperado precisa ser de até 100 caracteres, um resultado de (fim-inicio)>100 indica um problema. Você pode tratar o problema retornando erro ou truncando o valor, fazendo:

valor := substr(message, inicio, least(fim-inicio, 100));

Ou algo do tipo.
Responder

13/04/2023

Arthur Heinrich

Oi Arthur..

deu um erro aqui
variavel de bindig "SS" não declarada
Rodei no developer do oracle, não sei se serve.


O problema da bind variable pode estar relacionado aos parâmetros que a sua query utiliza...

replace(smart.f_resultado_rcl_2(relcir.rcl_laudo_tratado, 21156, 12), ''?'') Data_Cirurgia

... '?' ...

Para testar, a query precisa ser executada com todos os valores atribuídos.
Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar