1

Tengo un servicio (PUT) creado con ORDS 19.1 en BD Oracle 12c, cuando hago una petición y el Json del cuerpo lleva algún carácter acentuado (áéíóñ..etc) me genera un ORA-40441 en la linea l_top_obj := json_object_t.parse(l_json); he intentado usar blob y obtener el parámetro :body pero entonces los caracteres acentuados son convertidos a cosas como esta ó. El juego de caracteres de la base de datos es WE8MSWIN1252.

declare
  l_json                clob;
  l_top_obj             json_object_t;
  l_items_arr           json_array_t;
  l_item_obj            json_object_t;
  t_respuesta           clob;
  t_campos_ins          pkg_insumos.rec_registro;
begin
  if fbd_consulte_token_json(:token) = 'A' then
    l_json       := :body_text;
    l_top_obj    := json_object_t.parse(l_json);
    l_items_arr  := l_top_obj.get_array('items');
    for i in 0 .. l_items_arr.get_size - 1 loop
      l_item_obj                   := treat(l_items_arr.get(i) as json_object_t);   
      t_campos_ins.id_registro           := l_item_obj.get_number('id');            
      t_campos_ins.caso                  := l_item_obj.get_string('caso');
      t_campos_ins.id_fun                := l_item_obj.get_number('id_fun');        
      t_campos_ins.id_campo_fun          := l_item_obj.get_number('id_campo_fun');
      t_campos_ins.tipo_fun              := l_item_obj.get_string('tipo_fun');
      t_campos_ins.clase_fun             := l_item_obj.get_string('clase_fun');
      t_campos_ins.variable              := l_item_obj.get_string('variable');
      t_campos_ins.tipo_variable         := l_item_obj.get_string('tipo_variable');
      t_campos_ins.forma_captura         := l_item_obj.get_string('forma_captura');
      t_campos_ins.clase_variable        := l_item_obj.get_string('clase_variable');
      t_campos_ins.ubicacion_excel       := l_item_obj.get_string('ubicacion_excel');
      t_campos_ins.formula               := l_item_obj.get_string('formula');
      t_campos_ins.id_patch              := l_item_obj.get_number('id_patch');
      t_campos_ins.id_pantalla           := l_item_obj.get_number('id_pantalla');
      t_campos_ins.id_campo_pantalla     := l_item_obj.get_number('id_campo_pantalla');
      t_campos_ins.id_tabla              := l_item_obj.get_number('id_tabla');
      t_campos_ins.id_campo_tabla        := l_item_obj.get_number('id_campo_tabla');
      t_campos_ins.id_paquete            := l_item_obj.get_number('id_paquete');
      t_campos_ins.id_campo_paquete      := l_item_obj.get_number('id_campo_paquete');
      t_campos_ins.orden                 := l_item_obj.get_number('orden');
      t_campos_ins.id_opcion_menu        := l_item_obj.get_number('id_opcion_menu');
      t_campos_ins.origen_lista          := l_item_obj.get_string('origen_lista');
      t_campos_ins.lista_intermedio      := l_item_obj.get_string('lista_intermedio');
      t_campos_ins.id_col_filtro         := l_item_obj.get_number('id_col_filtro');
      t_campos_ins.filtro_lista          := l_item_obj.get_string('filtro_lista');
      t_campos_ins.heredar_valor_de      := l_item_obj.get_string('heredar_valor_de');
      t_campos_ins.filtro_usuario        := l_item_obj.get_string('filtro_usuario');
      t_campos_ins.filtro_tecnico        := l_item_obj.get_string('filtro_tecnico');
      t_campos_ins.estado_registro       := l_item_obj.get_string('estado_registro');
      t_campos_ins.id_ori_pantalla       := l_item_obj.get_number('id_ori_pantalla');
      t_campos_ins.id_col_filtro_pan     := l_item_obj.get_number('id_col_filtro_pan');
      t_campos_ins.aux_enlaces           := l_item_obj.get_string('aux_enlaces');
      t_campos_ins.filtro_inicial        := l_item_obj.get_string('filtro_inicial');
      pkg_insumos.Actualiza(t_campos_ins,t_respuesta);
      if t_respuesta='OK' then
       --  t_respuesta := json_object(key 'mensaje' value 'Registro actualizado');      
         :forward_location:='http://172.18.1.21:8484/ords/agsegu/PCI/insumos/:{token}?id_registro=' ||t_campos_ins.id_registro;
         :status          :=201;
      else
     --    t_respuesta := json_object(key 'mensaje' value 'No se pudo actualizar el registro: ' || t_respuesta);  
         :forward_location:=Null;
         :status          :=401;
         rollback;
         exit;
      end if;
    end loop; 
 end if;
 commit;
 HTP.print(l_top_obj.to_string);
exception when others then
  HTP.print(sqlerrm);
end;

Agradezco cualquier tip que me pueda ayudar ya que lo he intentado todo. Gracias

  • Bienvenido a StackOverflow veo que tienes poco tiempo por aqui te invito a hacer el [tour] ganara algunas medallas – JackNavaRow Jun 18 '19 at 15:25
  • mira esta pregunta tal vez te pueda ayudar : [¿Se pueden introducir caracteres especiales de un JSON?](https://es.stackoverflow.com/questions/169333/se-pueden-introducir-caracteres-especiales-de-un-json/169371#169371) – JackNavaRow Jun 18 '19 at 15:26
  • [Puedes ver una funcion de codificar y decodificar encode](http://www.dba-oracle.com/t_utl_encode_base64_decode_encode.htm) – JackNavaRow Jun 18 '19 at 15:35

1 Answers1

0

Luego de intentar todas las sugerencias recibidas mas las que encontré revisando más foros y fracasar en lograr resolver mi problema, lo único que me ha funcionado fue cambiar el juego de caracteres de la base de datos a AL32UTF8 de esa forma oracle puede trabajar con Json que contenga caracteres especiales sin ningún problema.

Gracias