Программирование >>  Oracle 

1 ... 158 159 160 [ 161 ] 162 163 164 ... 469


Загрузка данных

Теперь создадим оператор INSERT вида INSERT INTO TABLE (столбце!) VALUES (связ1ваем1е переменн1е). Количество вставляемых столбцов определяем путем подсчета запятых. Для этого берем длину текущего списка столбцов, вычитаем длину той же строки после удаления запятых и прибавляем 1 (это общий способ подсчета количества определенных символов в строке):

28 29 30 31

33 34 35 36

38 39 40 41 42

44 45

l buffer := insert into p table

( p cnames ) values (;

* Определяем количество запятых путем вычитания

* из текущей длины списка имен столбцов

* длины той же строки с удаленными запятыми

l colCnt

и прибавления 1.

length(p cnames)-

length(replace(p cnames ,))+1;

for i in 1

loop

l buffer

l sep end loop; l buffer : =

l colCnt l buffer

l sep :bi;

l buffer ) ;

Получили строку вида: insert into T (cl,c2,...)

values (:b1, :b2, ...)

Теперь, сформировав строку для оператора INSERT, разберем ее: 47 dbms sql.parse(l theCursor, l buffer, dbms sql.native);

затем прочитаем последовательно строки входного файла, разбивая их на столбцы:

48 49

51 52 53 54 55 56 57

58 59

60 61 62

63 64

loop

Читаем данные, */

begin

utl file.get line(l input, exception

when NO DATA FOUND then exit;

end; /*

* Анализировать строку удобнее,

* разделителем. */

l buffer

пока они есть, затем завершаем работу.

l lastLine);

если она завершается

:= llastLine pdelimiter;



Глава 9

65 66 67

68 69 70

for i in 1 . . l colCnt

loop

dbms sql.bind variable(l theCursor, :bi, substr(l buffer, 1,

instr(l buffer,p delimiter)-1)) lbuffer := substr(l buffer,

instr(l buffer,delimiter) + l) ;

end loop;

* Выполняем оператор insert. В случае ошибки

* помещаем строку данных в таблицу плохих строк.

*/ begin

lstatus := dbmssql. execute(l theCursor); l cnt := l cnt + 1;

exception

when others then

l errmsg := sqlerrm; insert into badlog (er, data) values (l errmsg, l lastLine) ;

end;

end loop;

После загрузки всех записей, которые можно б1ло загрузить, и помещения всех остальных в таблицу плохих строк, завершаем работу и возвращаем результат:

92 93

97 98 99 100 101 102

104 105

закрыть курсор, файл и зафиксировать записи

dbms sql.close cursor(l theCursor);

utl file.fclose(l input);

commit;

return 1 cnt; exception

when others then

dbms sql.close cursor(l theCursor);

if (utl file. is open ( l input )) then utl file.fclose(l input);

end if;

RAISE;

end load data; /

Function created.

Эту функцию можно использовать следующим образом: ops$tkyte@DEV816> create table tl (x int, у int, z int) ; Table created.



Загрузка данных

ops$tkyte@DEV816> ops$tkyte@DEV816> ops$tkyte@DEV816> ops$tkyte@DEV816>

host echo 1,2,3 > /tmp/tl.dat

host echo 4,5,6 >> /tmp/tl.dat

host echo 7,8,9 >> /tmp/tl.dat

host echo 7,NotANumber,9 >> /tnp/tl.dat

ops$tkyte@DEV816> begin

2 dbms output.put line <

3 load data(T1,

4 x,y,z,

5 c:\temp,

6 t1.dat,

7 ,) rows

8 end;

3 rows loaded

PL/SQL procedure successfully completed. ops$tkyte@DEV816> SELECT *

2 FROM BADLOG;

loaded)

ERRM

DATA

ORA-01722: invalid number 7,NotANumber,9 ops$tkyte@DEV816> select * from tl;

Конечно, это решение уступает по гибкости SQLLDR, поскольку нет способа задать максимально допустимое количество ошибок или указать, куда помещать плохие записи, нельзя задать символ, в который могут быть взяты значения полей, и т.д., но понятно, насколько легко добавить эти возможности. Например, чтобы добавить необязательный символ кавычек вокруг значений полей, достаточно добавить параметр

P ENCLOSED BY и заменить вызов DBMS SQL.BIND следующим:

loop

dbms sql.bind variable(l theCursor, :bi, trim (nvl (p enclosed by, chr(0)) FROM

substr(l buffer, 1,

instr(l buffer,p delimiter)-l)); l buffer := substr(l buffer,

instr(l buffer,p delimiter)+l);

end loop;

сымитировав опцию OPTIONALLY ENCLOSED BY утилиты SQLLDR. Представленная выше функция вполне подходит для загрузки небольших объемов данных, однако, как будет показано в главе 16, при необходимости масштабирования в нее придется добавить подпрограмму для обработки массивов данных. В этой главе можно найти примеры использования массивов для множественной вставки данных.



1 ... 158 159 160 [ 161 ] 162 163 164 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки.
Яндекс.Метрика