Plsql_Delimited_String.Getstring ([низ, съдържащ разделен текст, целият ред],
[случай],
[незавършена булева стойност по подразбиране false],
[делиметър]);
В следващата процедура потребителят ще предаде име на файл, което трябва да бъде в местоположението на директорията, създадено в обекта директория на Oracle, в този пример се използва обект на директория 'YOUR_DIRECTORY', променете го с вашия обект на директория и копирайте файла с разделители на това място, след което преминете името на файла за тази процедура.
СЪЗДАДЕТЕ ИЛИ ЗАМЕНЕТЕ ПРОЦЕДУРА Import_Emp_File (P_FILENAME IN VARCHAR2,o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000 VVAR_0); );
-- Масив със стойности на полета
ТИП Стойността на полето Е ТАБЛИЦА НА VARCHAR2 (100)
ИНДЕКС ПО BINARY_INTEGER;
Позиция_поле Стойност на полето;
Total_Rec_Count NUMBER :=0;
Total_Rec_Processed NUMBER :=0;
BEGIN
Infile :=UTL_FILE.Fopen ('YOUR_DIRECTORY', P_FILENAME, 'R');
LOOP
---
UTL_FILE.Get_Line (Infile, Linebuf);
-- добавяне на допълнителна тръба в края на реда за четене на всички полета
Linebuf :=Linebuf || '|';
-- Да предположим, че файлът съдържа шест ограничени низове с тръба (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf ,
I,
FALSE,
'|');
КРАЙ LOOP;
BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;
-- примерна таблица
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
СТОЙНОСТИ (позиция_поле (1),
позиция_поле (2),
позиция_поле (3),
позиция_поле (4),
позиция_поле (5),
позиция_поле (6) );
Total_Rec_Processed :=Total_Rec_Processed + 1;
ИЗКЛЮЧЕНИЕ
КОГАТО ДРУГИ
ТОГАВА
-- игнориране на грешка по време на вмъкване на база данни
NULL;
END;
КРАЙ ЛООП;
АКО UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
ИЗКЛЮЧЕНИЕ
КОГАТО НЯМА_ДАННИ
ТОГАВА
IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
АКО total_rec_processed> 0
ТОГАВА
COMMIT;
КРАЙ АКО;
КОГАТО ДРУГИ
ТОГАВА
АКО UTL_FILE.is_open (infile)
ТОГАВА
UTL_FILE.Fclose (Infile);
END IF;
o_msg :=SQLERRM;
END;
/По-долу е източникът на пакета на PLSQL_DELIMITED_STRING, използван в този пример, инсталирайте този пакет във вашата схема. Пакетът съдържа много други помощни функции, които могат да се използват за четене на csv файла с помощта на PLSQL:
функция Брояч( Source_string в varchar2,
UnTerminated в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') връщане на номер;
Процедура PutString( Source_string в изход varchar2,
String_to_add в varchar2,
Позиция на поле в брой,
Незавършва в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',');
Процедура PutNumber( Source_string in out varchar2,
number_to_add в число,
Позиция_на поле в брой,
Незавършва в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',');
Процедура PutDate( Source_string in out varchar2,
Дата_за_добавяне в дата,
Позиция_на поле в брой,
Непрекратено в Бо olean по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',');
функция GetString( Source_string в varchar2,
Позиция на полето в число,
Незавършва в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') връщане varchar2;
функция GetNumber( Source_string в varchar2,
Позиция на полето в число,
UnTerminated в булева по подразбиране FALSE,
Ограничител в varchar2 по подразбиране ', ') връщане на число;
функция GetDate( Източник_низ в varchar2,
Позиция_на поле в число,
Непрекратено в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') дата на връщане;
функция Locate( Source_string в varchar2,
Search_String в varchar2,
UnTerminated в Boole по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') връщане на номер;
функция Локация (източник_низ в varchar2,
Търсене_дата в дата,
Непрекратено в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') връщане на число;
функция Локация (източник_низ в varchar2,
Търсене_номер в число,
Непрекъснат в булева по подразбиране FALSE,
Разграничител в varchar2 по подразбиране ',') връщане на номер;
END plsql_Delimited_String;
/
СЪЗДАДЕТЕ ИЛИ ЗАМЕНЕТЕ ТЯЛО НА ПАКЕТА plsql_Delimited_String
IS
FUNCTION Counter (Source_string IN VARCHAR2,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Ограничител В VARCHAR2 DEFAULT ', RETURN)
'
IS
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BEGIN
IF Unterminated
THEN
iModifier :=1;
КРАЙ АКО;
ВРЪЩАНЕ (iOldSize - LENGTH (ЗАМЕНЕТЕ (източен_низ, разделител)))
+ iModifier;
END Counter;
ПРОЦЕДУРА PutString (Source_string IN OUT VARCHAR2,
String_to_add IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Ограничител В VARCHAR2 DEFAULT ',')
IS
iStrLen PLS_INTEGER :=LENGTH (Source_String);
iStrFragLen PLS_INTEGER :=LENGTH (String_to_add);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_0;> vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
BEGIN
-- 1. нулева дължина ли е низът?
АКО iStrLen =0
ТОГАВА
АКО Field_Position> 1
THEN
FOR iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Ограничител;
КРАЙ LOOP;
END IF;
Източен_низ :=vcSepBuffer || Добавяне на низ;
АКО НЕ е непрекратен
ТОГАВА
Изходен_низ :=Изходен_низ || Разграничител;
iStrLen :=LENGTH (източен_низ);
END IF;
ELSE
-- 2. Справете се с непрекъснати низове
IF UnTerminated
THEN
Източен_низ :=Източен_низ || Ограничител;
END IF;
-- 3. Намерете разделителя nth-1
IF Field_Position> 1
THEN
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Ограничител,
1,
Позиция_на поле - 1)
- 1)
+ LENGTH (разделител);
ИЗХОД КОГАТО iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || Ограничител;
КРАЙНА ЛИНИЯ;
АКО vcSepBuffer НЕ Е NULL
ТОГАВА
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (източен_низ,
разделител,
1 ,
Позиция_на поле);
IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
END IF;
END IF;
ELSE
iPtrStart :=0;
iPtrEnd :=
INSTR (източен_низ,
разделител,
1,
Позиция_на поле);
IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
END IF;
END IF;
-- 3. Изградете отново низа
Източен_низ :=
SUBSTR (Източен_низ, 1, iPtrStart)
|| vcSepBuffer
|| Низ_за_добавяне
|| Разделител
|| SUBSTR (източен низ, iPtrEnd + LENGTH (разделител));
-- 4. Сортирайте прекратяването
АКО не е прекратено
ТОГАВА
Източен_низ :=
SUBSTR (Източен_низ,
1,
(ДЪЛЖИНА (Източен_низ) - LENGTH (Разделител)));
КРАЙ АКО;
КРАЙ АКО;
КРАЙ PutString;
ПРОЦЕДУРА PutNumber (източник_низ В ИЗ VARCHAR2,
номер_за_добавяне В NUMBER,
Позиция_на поле В NUMBER,
Непрекратено В БУЛЕВА ПОДРАЗБИРАНЕ FALSE,
Ограничител В VARCHAR2 ПО ПОДРАЗБИРАНЕ ',')
IS
BEGIN
-- 1. Просто направете преобразувания на типове данни и извикайте varchar2 версията на put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (число_за_добавяне),
Позиция_на поле,
Непрекратено,
Разделител);
END PutNumber;
ПРОЦЕДУРА PutDate (Source_string IN OUT VARCHAR2,
Date_to_add IN DATE,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Ограничител В VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Просто направете преобразувания на типове данни и извикайте varchar2 версията на put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MON-YYYY HH24:MI:SS'),
Позиция_на поле,
Непрекратено,
Разграничител);
END PutDate;
ФУНКЦИЯ GetString (Source_string IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Ограничител В VARCHAR2 DEFAULT ',')
ВРЪЩАНЕ VARCHAR2
Е
iPtrEnd PLS_INTEGER :=0;
iPtrStart PLS_INTEGER :=0;
vcSourceStrCopy VARCHAR2 (2000) :=Source_string;
BEGIN
АКО не е прекратен
ТОГАВА
vcSourceStrCopy :=vcSourceStrCopy || Ограничител;
END IF;
IF Field_Position> 1
THEN
iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (Разделител);
ELSE
iPtrStart :=1;
END IF;
iPtrEnd :=
INSTR (vcSourceStrCopy,
Разделител,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
КРАЙ GetString; /* Версия на низ */
ФУНКЦИЯ GetNumber (Източен_низ В VARCHAR2,
Позиция_на поле В NUMBER,
Непрекратено В БУЛЕВА ПОДРАЗБИРАНЕ FALSE,
Ограничител В VARCHAR2 ПО ПОДРАЗБИРАНЕ ',')
ВЪЗРАЩАНЕ НА НОМЕР
Е
iRc PLS_INTEGER;
BEGIN
ВРЪЩАНЕ КЪМ_НОМЕРА (GetString (Източен_низ,
Позиция_поле,
Непрекъснат,
Разделител));
END GetNumber; /* Версия на номера */
ФУНКЦИЯ GetDate (Source_string IN VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Ограничител В VARCHAR2 DEFAULT ',')
ДАТА ЗА ВРЪЩАНЕ
Е
BEGIN
RETURN TO_DATE (GetString (Source_string,
Field_Position,
UnTerminated,
Delimiter), 'DD-MON-YYYY HH24:MI:SS');
END GetDate; /* Версия с дата */
ФУНКЦИЯ Намерете (източник_низ В VARCHAR2,
Търсене_низ В VARCHAR2,
Непрекратен В БУЛЕВА ПОДРАЗБИРАНЕ FALSE,
Ограничител В VARCHAR2 DEFAULT ',')
ВЪЗРАЩАНЕ НА НОМЕР
Е
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcСравнете VARCHAR2 (2000);
BEGIN
ЗА iCounter IN 1 .. Counter (Source_String, UnTerminated, Delimiter)
LOOP
IF GetString (Source_String,
iCounter,
UnTerminated,
Delimiter) =Search_String
THEN
iHit :=iCounter;
ИЗХОД;
КРАЙ НА АКО;
КРАЙ НА КРИКТА;
ВРЪЩАНЕ iHit;
КРАЙ Намерете;
FUNCTION Намиране (Източен_низ В VARCHAR2,
Търсене_дата В ДАТА,
Непрекратен В БУЛЕВА ПОДРАЗБИРАНЕ FALSE,
Ограничител В VARCHAR2 ПО ПОДРАЗБИРАНЕ ',')
ВЪЗРАЩЕН НОМЕР
Е
BEGIN
ВРЪЩАНЕ Намерете (източен_низ,
TO_CHAR (дата на търсене, 'DD-MON-YYYY HH24:MI:SS'),
Непрекратен,
Разграничител);
КРАЙ Намерете; /* Версия с дата */
ФУНКЦИЯ Намерете (Източен_низ В VARCHAR2,
Търсене_номер В NUMBER,
Непрекратен В БУЛЕВА ПОДРАЗБИРАНЕ FALSE,
Ограничител В VARCHAR2 ПО ПОДРАЗБИРАНЕ ',')
ВЪЗРАЩАНЕ НА НОМЕР
Е
BEGIN
ВЪЗРАЩАНЕ Намиране (източен_низ,
TO_CHAR (номер_търсене),
Непрекратен,
Разграничител);
END Намиране; /* Номер Версия */
КРАЙ; /* Тяло */
/