powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms 6i. Как быстро загрузить данные из текстового файла в БД.
2 сообщений из 2, страница 1 из 1
Oracle Forms 6i. Как быстро загрузить данные из текстового файла в БД.
    #35774211
Razrab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подскажите, пожалуйста, каким образом можно оптимизировать ввод данных из текстового файла в таблицу СУБД Oracle из Oracle Forms 6i? Прога на Oracle Forms построчно считывает данные из текстового файла, посредством встроенного пакета Text_IO в табличный массив. Затем уже вставляет (Insert) эти данные из массива в таблицу Oracle. Но при большом объеме текстового файла (свыше 250.000 строк) все происходит очень медленно - часа четыре. Привожу кусок кода по загрузке:

Код: plaintext
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.
declare

  in_file   Text_IO.File_Type;
  out_file  Text_IO.File_Type;
  linebuf   varchar2( 32000 );
  v_shablon varchar2( 1000 );
  ii number;
  v_pay_cnt number;
  type pays_type is table of T1%ROWTYPE
    index by binary_integer;
  v_pays pays_type;

begin
...  -- формируем v_shablon из таблицы

   v_pays.Delete;
  :global.f_path:=GET_FILE_NAME('',null,v_shablon,null,OPEN_FILE,TRUE);
  :global.f_path_file := substr(:global.f_path,instr(:global.f_path,'\',- 1 ) + 1 );

  if :global.f_path is not null then
  
  in_file  := Text_IO.Fopen(:global.f_path, 'r');
 begin
  loop
              Text_IO.Get_Line(in_file,linebuf);

    	v_pay_cnt := v_pays.COUNT +  1 ;
    	
    	v_pays(v_pay_cnt).ID_FILE := v_id_file;
    	select seq_bt_a_p.nextval into v_pays(v_pay_cnt).ID_PAY from dual;
    	v_pays(v_pay_cnt).KD_SUBSH := substr(linebuf,  1 ,  3 );
    	v_pays(v_pay_cnt).NN_OSB := substr(linebuf,  4 ,  5 );
    	v_pays(v_pay_cnt).NN_FOSB := substr(linebuf,  9 ,  5 );
    	v_pays(v_pay_cnt).NN_KNG := substr(linebuf,  14 ,  5 );
    	v_pays(v_pay_cnt).NN_ABN := substr(linebuf,  19 ,  3 );
    	select decode(substr(linebuf,  24 ,  2 ),  0 ,  1 , substr(linebuf,  24 ,  2 ))
    	  into v_pays(v_pay_cnt).KD_PAY
    	  from dual;
    	v_pays(v_pay_cnt).DT_PAY := to_date(substr(linebuf,  26 ,  6 ), 'ddmmyy');
    	v_pays(v_pay_cnt).DT_PER := to_date(substr(linebuf,  32 ,  3 ), 'mmy');
    	v_pays(v_pay_cnt).RD_POKL := substr(linebuf,  35 ,  6 );
    	v_pays(v_pay_cnt).RD_POKF := substr(linebuf,  41 ,  6 );
    	v_pays(v_pay_cnt).SM_PAY := substr(linebuf,  47 ,  15 );

  end  loop;
 exception
  	WHEN no_data_found THEN
  	  Text_IO.Fclose(in_file);
 end;

  if v_pays.COUNT >  0  then
  	
  for ii in v_pays.FIRST .. v_pays.LAST loop
    insert into T1 (ID_FILE, ID_PAY, NN_OSB, NN_FOSB, NN_OPE, NN_KNG, NN_ABN, KD_PAY, KD_TRU,   DT_PAY, DT_PER, RD_POKL, RD_POKF, SM_PAY, SM_PENY, PR_REC, KD_SUBSH, NN_KONTR, DLT_READ, NM_ID_OUTORG)
    values (v_pays(ii).ID_FILE, v_pays(ii).ID_PAY, v_pays(ii).NN_OSB, v_pays(ii).NN_FOSB, v_pays(ii).NN_OPE, v_pays(ii).NN_KNG, v_pays(ii).NN_ABN, v_pays(ii).KD_PAY, v_pays(ii).KD_TRU, v_pays(ii).DT_PAY, v_pays(ii).DT_PER, v_pays(ii).RD_POKL, v_pays(ii).RD_POKF, v_pays(ii).SM_PAY, v_pays(ii).SM_PENY, v_pays(ii).PR_REC, v_pays(ii).KD_SUBSH, v_pays(ii).NN_KONTR, v_pays(ii).DLT_READ, v_pays(ii).NM_ID_OUTORG);    
  end loop;
  
  end if;

end;

Собственно формирование массива v_pays происходит дольше всего - по времени более 3-х часов. Поэтому первое, что я сделал - убрал данный массив совсем, переписав все сразу на построчный Insert:

Код: plaintext
1.
2.
3.
4.
5.
    insert into T1 (ID_FILE, ID_PAY, NN_OSB, NN_FOSB, NN_OPE, NN_KNG, NN_ABN, KD_PAY, KD_TRU, DT_PAY, DT_PER, RD_POKL, RD_POKF, SM_PAY, SM_PENY, PR_REC, KD_SUBSH, NN_KONTR, DLT_READ, NM_ID_OUTORG)
    values (v_id_file, v_seq_id_pay, substr(linebuf,  4 ,  5 ), substr(linebuf,  9 ,  5 ), NULL, 
	substr(linebuf,  14 ,  5 ), substr(linebuf,  19 ,  3 ), v_pays_kd_pay, NULL, 
    	to_date(substr(linebuf,  26 ,  6 ), 'ddmmyy'), 
    	to_date(substr(linebuf,  32 ,  3 ), 'mmy'), substr(linebuf,  35 ,  6 ), substr(linebuf,  41 ,  6 ), 
    	substr(linebuf,  47 ,  15 ), NULL, NULL, substr(linebuf,  1 ,  3 ), NULL, NULL, NULL);  

Весь процесс ускорился, но незначительно - вместо 4-х часов - 3 с копейками. Это все равно очень долго. Что можете предложить в качестве более удачного быстродействия?
...
Рейтинг: 0 / 0
Oracle Forms 6i. Как быстро загрузить данные из текстового файла в БД.
    #35774776
AndrK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Razrab,
скорее ничего не поможет в самом формсе, кроме как через user_exit свою dll-ку цеплять для загрузки.
А если если по host loader вызывать и им грузить, заметно шустрее должно быть.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Oracle Forms [игнор отключен] [закрыт для гостей] / Oracle Forms 6i. Как быстро загрузить данные из текстового файла в БД.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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