FUNCTION raw2varchar2(p_raw    IN RAW,
                      p_cset_f IN VARCHAR2 DEFAULT NULL,
                      p_cset_t IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 IS
  l_buf_cset_f VARCHAR2(32000);
  l_buf_cset_t VARCHAR2(32000);
  l_return_status VARCHAR2(1);
  l_msg_count     NUMBER;
  l_msg_data      VARCHAR2(4000);
BEGIN
  l_buf_cset_f := utl_raw.cast_to_varchar2(p_raw);
  heb_log.put_line('default charset, l_buf_cset_f lenb:' || lengthb(l_buf_cset_f));
  heb_log.put_line(l_buf_cset_f);
  IF p_cset_f IS NOT NULL
     AND p_cset_t IS NOT NULL THEN
    
    l_buf_cset_t := convert(l_buf_cset_f,
                            p_cset_t,
                            p_cset_f);
    
    heb_char_set_pub.check_convert(p_init_msg_list => fnd_api.g_false,
                                   p_commit        => fnd_api.g_false,
                                   x_return_status => l_return_status,
                                   x_msg_count     => l_msg_count,
                                   x_msg_data      => l_msg_data,
                                   p_cset_f        => p_cset_f,
                                   p_cset_t        => p_cset_t,
                                   p_len_f         => length(l_buf_cset_f),
                                   p_lenb_f        => lengthb(l_buf_cset_f),
                                   p_len_t         => length(l_buf_cset_t),
                                   p_lenb_t        => lengthb(l_buf_cset_t));
    heb_pub.raise_error(l_return_status);
    
  END IF;
  RETURN nvl(l_buf_cset_t,
             l_buf_cset_f);
END raw2varchar2;