|
Программирование >> Oracle
Загрузка данных Теперь создадим оператор 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, при необходимости масштабирования в нее придется добавить подпрограмму для обработки массивов данных. В этой главе можно найти примеры использования массивов для множественной вставки данных.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |