Oracle
 sql >> база данни >  >> RDS >> Oracle

Ефективно четене и импортиране на CSV файлове в Oracle PL/SQL

Примерът е даден по-долу за четене и импортиране на CSV файл (разделен със запетая) в PLSQL. Има пакет във формите на Oracle "D2k_Delimited_String", който използваме за четене и импортиране на файл с разделители със запетая (или всеки разделител), написах публикация и в Oracle Forms за четене на файлове с разделители с този пакет, следната е връзката https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Същият пакет, който преобразувах в пакет на база данни, за да прочета CSV файл в PLSQL ефективно, преименувах пакета на "Plsql_Delimited_String". По-долу е даден пример за импортиране на csv файл в PL SQL с помощта на тази пакетна функция Get_String, следното е използването на тази функция:

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:

СЪЗДАДЕТЕ ИЛИ ЗАМЕНЕТЕ ПАКЕТ plsql_Delimited_String IS

функция Брояч( 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 Намиране; /* Номер Версия */
КРАЙ; /* Тяло */
/

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Върнете ред с максимална стойност от една колона на група

  2. Как да стартирате SQL Plus скрипт в PowerShell

  3. opatch предвар

  4. NLS_CHARSET_DECL_LEN() Функция в Oracle

  5. Преобразувайте разделен със запетая низ в масив в PL/SQL