powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Русские буквы BLOB
3 сообщений из 3, страница 1 из 1
Русские буквы BLOB
    #38178619
ExcellencE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть процедурка, которая парсит csv файл и заливает данные из него в таблицу. когда я импортирую этот файл средствами апекса - все проходит нормально, а когда этой процедурой - русские буквы теряются. можно-ли исправив это изменив код процедуры?

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
create or replace procedure parsecsv is
begin
DECLARE
v_blob_data       BLOB;
v_blob_len        NUMBER;
v_position        NUMBER;
i                 NUMBER;
v_raw_chunk       RAW(32767);
v_char      CHAR(1);
c_chunk_len   number       := 1;
v_line        VARCHAR2 (32767)        := NULL;
v_data_array      wwv_flow_global.vc_arr2;
BEGIN
-- Read data from wwv_flow_files
Select blob_content into v_blob_data 
from wwv_flow_file_objects$ 
where last_updated = (select max(last_updated) from wwv_flow_file_objects$) 
and id = (select max(id) from wwv_flow_file_objects$); 
 
v_blob_len := dbms_lob.getlength(v_blob_data);
v_position := 1;
 
-- Read and convert binary to char
WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 --v_char := utl_raw.cast_to_varchar2(v_raw_chunk);
 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
-- When a whole line is retrieved
 IF v_char = CHR(10) THEN
-- Convert each column separated by : into array of data
   v_data_array := wwv_flow_utilities.string_to_table (v_line, '|');
   i:=6;
   while(v_data_array.count <6) loop
                         v_data_array(i):=' ';
                         i:= i-1;
                         end loop;
-- Insert data into target table 
     EXECUTE IMMEDIATE 'insert into APEX_DB.ZF2TABLE (A, B, C, D, E, F)
      values (:1,:2,:3,:4,:5, :6)'
      USING
        v_data_array(1),
        v_data_array(2),
        v_data_array(3),
        v_data_array(4),
        v_data_array(5),
        v_data_array(6);
        -- Clear out
     v_line := NULL;
  END IF;
 END LOOP;
     Exception
      when NO_DATA_FOUND then DBMS_OUTPUT.PUT_LINE('NO data found');
END;
commit;
end parsecsv;
...
Рейтинг: 0 / 0
Русские буквы BLOB
    #38179173
Migelle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какая кодировка у файла и в какой кодировке БД работает? Скорее всего они не совпадают, надо сначала конвертировать, а потом разбирать.
А вообще лучше сначала blob в clob конвертнуть, чтобы не извращаться с raw, а работать с простым текстом. Типа:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
   FUNCTION BlobToClob (Src BLOB)
      RETURN CLOB IS
      Result     CLOB;
      iLen       INTEGER := Dbms_lob.lobmaxsize;
      iSrcOffs   INTEGER := 1;
      iDstOffs   INTEGER := 1;
      iCSID      INTEGER := Nls_charset_id ('CL8MSWIN1251'); 
      iLang      INTEGER := Dbms_lob.default_lang_ctx;
      iWarn      INTEGER;
   BEGIN
      IF NOT ( (Src IS NULL) OR (Dbms_lob.GetLength (Src) = 0)) THEN
         Dbms_lob.CreateTemporary (Result, TRUE);
         Dbms_lob.ConvertToClob (Result, Src, iLen, iSrcOffs, iDstOffs, iCSID, iLang, iWarn);
      ELSE
         Result   := NULL;
      END IF;
      RETURN (Result);
   END;
...
Рейтинг: 0 / 0
Русские буквы BLOB
    #38180508
ExcellencE
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Migelle,

У блоба кодировка 1251, у БД UTF8. делаю конвертацию в клоб предложенным вами способом- правильно конвертирует только часть файла.

Спасибо за ответ))

сейчас это выглядит так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
DECLARE
       v_blob_data       BLOB;
       v_clob_data       CLOB;
       v_blob_len        NUMBER;
       v_position        NUMBER;
       i                 NUMBER;
       v_raw_chunk       RAW(1);
       v_char      CHAR(2);
       c_chunk_len   number       := 1; 
       v_line        VARCHAR2 (32767)        := NULL;
       v_data_array      wwv_flow_global.vc_arr2;
       l_dest_offset   integer := 1;
       l_source_offset integer := 1;
       l_lang_context  integer := DBMS_LOB.DEFAULT_LANG_CTX;
       l_warning       integer := DBMS_LOB.WARN_INCONVERTIBLE_CHAR;
BEGIN
  DBMS_OUTPUT.PUT('procedure parsecsv');
-- Read data from wwv_flow_files
Select blob_content into v_blob_data 
from wwv_flow_file_objects$ 
where last_updated = (select max(last_updated) from wwv_flow_file_objects$) 
and id = (select max(id) from wwv_flow_file_objects$); 
 
v_blob_len := dbms_lob.getlength(v_blob_data);
v_position := 1;
--v_clob_data := b2c(v_blob_data);
DBMS_LOB.CREATETEMPORARY(v_clob_data, TRUE);
DBMS_LOB.CONVERTTOCLOB
  (
   dest_lob    =>v_clob_data,
   src_blob    =>v_blob_data,
   amount      =>DBMS_LOB.LOBMAXSIZE,
   dest_offset =>l_dest_offset,
   src_offset  =>l_source_offset,
   blob_csid   =>NLS_CHARSET_ID ('CL8MSWIN1251'),
   lang_context=>l_lang_context,
   warning     =>l_warning
  );
 
-- Read and convert binary to char
WHILE ( v_position <= v_blob_len ) LOOP
 v_raw_chunk := dbms_lob.substr(v_blob_data,c_chunk_len,v_position);
 --v_char :=  chr(hex_to_decimal(rawtohex(v_raw_chunk)));
 --v_char := utl_raw.cast_to_varchar2(v_raw_chunk);
 --v_char := UTL_RAW.cast_to_varchar2(DBMS_LOB.substr(v_blob_data,c_chunk_len,v_position));
v_char :=  dbms_lob.substr(v_clob_data,c_chunk_len,v_position);

 v_line := v_line || v_char;
 v_position := v_position + c_chunk_len;
-- When a whole line is retrieved
 IF v_char = '\n' THEN
   v_data_array := wwv_flow_utilities.string_to_table (v_line, '|');
   i:=6;
   while(v_data_array.count <6) loop
                         v_data_array(i):='';
                         i:= i-1;
                         end loop;
-- Insert data into target table 
     EXECUTE IMMEDIATE 'insert into APEX_DB.ZF2TABLE (A, B, C, D, E, F)
      values (:1,:2,:3,:4,:5, :6)'
      USING
        v_data_array(1),
        v_data_array(2),
        v_data_array(3),
        v_data_array(4),
        v_data_array(5),
        v_data_array(6);
        -- Clear out
     v_line := NULL;
  END IF;
 END LOOP;
     Exception
      when NO_DATA_FOUND then DBMS_OUTPUT.PUT_LINE('NO data found');
END;
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Русские буквы BLOB
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]