Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Wydajne odczytywanie i importowanie plików CSV w Oracle PL/SQL

Poniższy przykład umożliwia odczytywanie i importowanie plików CSV plik (rozdzielany przecinkami) w PLSQL. Jest pakiet w formularzach Oracle "D2k_Delimited_String", którego używamy do odczytu i importu pliku rozdzielanego przecinkami (lub dowolnym separatorem), napisałem post również na Oracle Forms, aby odczytać pliki rozdzielane z tym pakietem, poniżej jest link https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Ten sam pakiet przekonwertowałem na pakiet bazy danych, aby sprawnie odczytać plik CSV w PLSQL, zmieniłem nazwę pakietu na "Plsql_Delimited_String". Poniżej znajduje się przykład importu pliku csv w PL SQL za pomocą tej funkcji pakietu Get_String, poniżej przedstawiono zastosowanie tej funkcji:

Plsql_Delimited_String.Getstring ([ciąg zawierający oddzielony tekst, cały wiersz],
[wystąpienie],
[niezakończona wartość logiczna domyślna false],
[ogranicznik]);

W poniższej procedurze użytkownik przekaże nazwę pliku, który powinien znajdować się w lokalizacji katalogu utworzonej w obiekcie katalogu Oracle, w tym przykładzie używany jest obiekt katalogu 'TWÓJ_KATALOG', zmień go za pomocą obiektu katalogu i skopiuj plik rozdzielany w tej lokalizacji, a następnie przekaż nazwę pliku do tej procedury.

UTWÓRZ LUB ZAMIEŃ PROCEDURĘ Import_Emp_File (P_FILENAME IN VARCHAR2,
o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
V_Getstring VARCHAR2 (100 );

-- Tablica wartości pól
TYP Wartość pola JEST TABELĄ VARCHAR2 (100)
INDEKS WEDŁUG BINARY_INTEGER;

Field_Position Wartość pola;

Total_Rec_Count NUMBER :=0;
Total_Rec_Processed NUMBER :=0;
BEGIN
Plik :=UTL_FILE.Fopen ('TWÓJ_KATALOG', P_FILENAME, 'R');

LOOP
---
UTL_FILE.Get_Line (Infile, Linebuf);
-- dodanie dodatkowego potoku na końcu linii, aby odczytać wszystkie pola

Buf linii :=Buf linii || '|';

-- Załóżmy, że plik zawiera sześć rozdzielonych ciągów znaków z kreską (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf ,
Ja,
FAŁSZ,
'|');
KONIEC PĘTLI;

BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;

-- przykładowa tabela
INSERT INTO PEM (NUMER_PRACOWNIKA,
IMIĘ_NAZWISKO,
NAZWISKO,
DATA_DOŁĄCZENIA,
TYP_PRAC,
DATA_REGN)
WARTOŚCI (pozycja_pola (1),
pozycja_pola (2),
pozycja_pola (3),
pozycja_pola (4),
pozycja_pola (5),
pozycja_pola (6) );

Total_Rec_Processed :=Total_Rec_Processed + 1;
WYJĄTEK
KIEDY INNI
TO
-- ignorowanie błędu podczas wstawiania bazy danych
NULL;
END;
PĘTLA KOŃCOWA;

JEŻELI UTL_FILE.is_open (plik)
TO
UTL_FILE.Fclose (plik);
KONIEC JEŻELI;
WYJĄTEK
KIEDY NIE ZNALEZIONO_DANYCH
TO
JEŻELI UTL_FILE.is_open (plik wejściowy)
TO
UTL_FILE.Fclose (plik wejściowy);
KONIEC JEŻELI;

JEŻELI total_rec_processed> 0
TO
POTWIERDZENIE;
KONIEC JEŻELI;
KIEDY INNI
TO
JEŚLI PLIK_UTL.is_open (plik)
TO
UTL_FILE.Fclose (Infile);
END IF;

o_msg :=SQLERRM;
END;
/Poniżej znajduje się źródło pakietu PLSQL_DELIMITED_STRING używanego w tym przykładzie, zainstaluj ten pakiet w swoim schemacie. Pakiet zawiera wiele innych funkcji narzędziowych, które można wykorzystać do odczytania pliku csv za pomocą PLSQL:

UTWÓRZ LUB ZAMIEŃ PAKIET plsql_Delimited_String IS

function Counter( Ciąg_źródłowy w varchar2,
Niezakończony w wartości logicznej domyślnie FALSE,
Ogranicznik w varchar2 domyślnie ',') zwraca numer;
Procedura PutString( Ciąg_źródłowy w wyj varchar2,
Ciąg_do_dodania w varchar2,
Pozycja pola w liczbie,
Niezakończona w wartości logicznej FAŁSZ,
Ogranicznik w varchar2 domyślnie ',');
Procedura PutNumber( Ciąg_źródłowy w out varchar2,
number_to_add w liczbie,
Pozycja_pola w liczbie,
Niezakończona w wartości logicznej domyślna FAŁSZ,
Ogranicznik w domyślnie varchar2 ',');
Procedura PutDate( Ciąg_źródłowy w wyj. varchar2,
Date_to_add in date,
Field_position in number,
Unterminated in Bo olean default FALSE,
Ogranicznik w varchar2 default ',');
function GetString( Source_string in varchar2,
Field_position in number,
Unterminated in Boolean default FALSE,
Ogranicznik w varchar2 domyślnie ',') return varchar2;
funkcja GetNumber( Source_string w varchar2,
Pozycja pola w liczbie,
Niezakończona w wartości logicznej domyślna FAŁSZ,
Ogranicznik w varchar2 domyślna ', ') numer powrotu;
funkcja GetDate( Ciąg_źródłowy w varchar2,
Pozycja_pola w liczbie,
Niezakończona w wartości logicznej domyślnie FAŁSZ,
Ogranicznik w wartości domyślnej varchar2 ',') data powrotu;
function Locate( Source_string in varchar2,
Search_String in varchar2,
Unterminated in Boole domyślny FAŁSZ,
Ogranicznik w varchar2 domyślny ',') zwraca numer;
funkcja Locate( Ciąg_źródłowy w varchar2,
Data_wyszukiwania w dacie,
Niezakończona w wartości logicznej domyślna FAŁSZ,
Ogranicznik w wartości domyślnej ',' ',') numer powrotu;
END plsql_Delimited_String;
/

UTWÓRZ LUB ZAMIEŃ BODY PAKIETU plsql_Delimited_String
JEST
LICZNIK FUNKCJI (ciąg_źródłowy W VARCHAR2,
Niezakończony W DOMYŚLNYM FAŁSZ,
Ogranicznik W VARCHAR2 DOMYŚLNY ',')
NUMER ZWROTU
JEST
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (ciąg_źródłowy);
BEGIN
IF Unterminated
THEN
iModifier :=1;
KONIEC JEŻELI;

RETURN (iOldSize - LENGTH (REPLACE (Source_string, Delimiter)))
+ iModifier;
END Counter;

PROCEDURA PutString (Source_string IN OUT VARCHAR2,
String_to_add IN VARCHAR2,
Field_position IN NUMBER,
Niezakończony W BOOLEAN DEFAULT FALSE,
Ogranicznik IN VARCHAR2 DEFAULT ',')
IS
iStrLen PLS_INTEGER :=LENGTH (Ciąg_źródłowy);
iStrFragLen PLS_INTEGER :=LENGTH (Ciąg_do_dodania);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_0;
vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
BEGIN
-- 1. jest ciągiem Zero Length?
IF iStrLen =0
THEN
JEŻELI Field_Position> 1
TO
DLA iCounter IN 2 .. Field_Position
PĘTLA
vcSepBuffer :=vcSepBuffer || Ogranicznik;
END LOOP;
END IF;

Ciąg_źródłowy :=vcSepBuffer || Ciąg_do_dodania;

JEŚLI NIE jest niezakończony
TO
Ciąg_źródłowy :=Ciąg_źródłowy || Delimiter;
iStrLen :=DŁUGOŚĆ (ciąg_źródłowy);
END IF;
ELSE
-- 2. Poradź sobie z niekończonymi ciągami
JEŻELI NIE ZAKOŃCZONY
TO
Ciąg_źródłowy :=Ciąg_źródłowy || Ogranicznik;
KONIEC JEŻELI;

-- 3. Zlokalizuj separator nth-1
IF Field_Position> 1
THEN
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Delimiter,
1,
Field_Position - 1)
- 1)
+ DŁUGOŚĆ (Delimiter);
WYJDŹ GDY iPtrStart> 0;
vcSepBuffer :=vcSepBufor || Ogranicznik;
KONIEC PĘTLI;

JEŻELI vcSepBuffer NIE JEST NULL
TO
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (String_źródłowy,
Delimiter,
1 ,
Pole_Pozycja);

IF iPtrEnd =0
TO
iPtrEnd :=iStrLen;
END IF;
END IF;
ELSE
iPtrStart :=0;
iPtrEnd :=
INSTR (ciąg_źródłowy,
separator,
1,
pozycja_pola);

JEŻELI iPtrEnd =0
TO
iPtrEnd :=iStrLen;
END IF;
END IF;

-- 3. Przebuduj ciąg
Ciąg_źródłowy :=
SUBSTR (ciąg_źródłowy, 1, iPtrStart)
|| vcSepBuffer
|| Ciąg_do_dodania
|| Ogranicznik
|| SUBSTR (ciąg_źródłowy, iPtrEnd + DŁUGOŚĆ (ogranicznik));

-- 4. Uporządkuj zakończenie
JEŚLI Niezakończone
THEN
Ciąg_źródłowy :=
SUBSTR (Ciąg_źródłowy,
1,
(DŁUGOŚĆ (ciąg_źródłowy) - DŁUGOŚĆ (ogranicznik)));
END IF;
END IF;
END PutString;

PROCEDURA PutNumber (Source_string IN OUT VARCHAR2,
number_to_add IN NUMBER,
Pole_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Ogranicznik IN VARCHAR2 DEFAULT ',')
JEST
BEGIN
-- 1. Po prostu wykonaj konwersje typów danych i wywołaj wersję varchar2 put..
plsql_Delimited_String.PutString (ciąg_źródłowy,
TO_CHAR (liczba_do_dodania),
Field_position,
Niezakończony,
Ogranicznik);
END PutNumber;

PROCEDURA PutDate (Source_string IN OUT VARCHAR2,
Date_to_add IN DATE,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
JEST
BEGIN
-- 1. Po prostu wykonaj konwersje typów danych i wywołaj wersję varchar2 put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MON-RRRR HH24:MI:SS'),
Pole_pozycja,
Niezakończone,
Ogranicznik);
END PutDate;

FUNKCJA GetString (Source_string W VARCHAR2,
Pole_position IN NUMBER,
Unterminated W BOOLEAN DEFAULT FAŁSZ,
Ogranicznik W VARCHAR2 DEFAULT ',')
POWRÓT VARCHAR2
JEST
iPtrEnd PLS_INTEGER :=0;
iPtrStart PLS_INTEGER :=0;
vcSourceStrCopy VARCHAR2 (2000) :=Source_string;
BEGIN
JEŚLI Niezakończone
TO
vcSourceStrCopy :=vcSourceStrCopy || Ogranicznik;
KONIEC JEŻELI;

JEŻELI Pozycja_pola> 1
TO
iPtrStart :=
INSTR (vcSourceStrCopy,
Ogranicznik,
1,
Pozycja_pola - 1)
+ DŁUGOŚĆ (Ogranicznik);
W INNYM PRZYPADKU
iPtrStart :=1;
KONIEC JEŻELI;

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Pole_Pozycja);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
KONIEC GetString; /* Wersja ciągu */

FUNKCJA GetNumber (Source_string W VARCHAR2,
Pole_position IN NUMBER,
Unterminated W BOOLEAN DEFAULT FAŁSZ,
Ogranicznik W VARCHAR2 DEFAULT ',')
NUMER ZWROTU
JEST
iRc PLS_INTEGER;
BEGIN
RETURN TO_NUMBER (GetString (Source_string,
Field_Position,
Unterminated,
Delimiter));
END GetNumber; /* Wersja numeru */

FUNKCJA GetDate (Source_string W VARCHAR2,
Pole_position IN NUMBER,
Unterminated W BOOLEAN DEFAULT FAŁSZ,
Ogranicznik W VARCHAR2 DEFAULT ',')
DATA ZWROTU
JEST
BEGIN
POWRÓT DO_DATA (GetString (ciąg_źródłowy,
Pozycja_pola,
Niezakończony,
Ogranicznik), 'DD-PON-RRRR HH24:MI:SS');
KONIEC GetData; /* Data Wersja */

FUNKCJA Zlokalizuj (ciąg_źródłowy W VARCHAR2,
Ciąg_szukaj W VARCHAR2,
Niezakończony W DOMYŚLNYM ZNAKU FAŁSZ,
Ogranicznik W DOMYŚLNYM VARCHAR2 ',')
NUMER ZWROTU
JEST
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcCompare VARCHAR2 (2000);
BEGIN
FOR iCounter IN 1 .. Counter (Source_String, Unterminated, Delimiter)
PĘTLA
JEŻELI GetString (Source_String,
iCounter,
Unterminated,
Delimiter) =Search_String
THEN
iHit :=iCounter;
EXIT;
END IF;
END LOOP;

RETURN iHit;
END Znajdź;

FUNKCJA Zlokalizuj (ciąg_źródłowy W VARCHAR2,
Data_wyszukiwania W DACIE,
Niezakończony W DOMYŚLNYM ZNAKU FAŁSZ,
Ogranicznik W DOMYŚLNYM VARCHAR2 ',')
NUMER ZWROTU
JEST
BEGIN
RETURN Zlokalizuj (ciąg_źródłowy,
TO_CHAR (data_wyszukiwania, 'DD-MON-RRRR HH24:MI:SS'),
Niezakończony,
Ogranicznik);
KONIEC Zlokalizuj; /* Data Wersja */

FUNKCJA Zlokalizuj (łańcuch_źródłowy W VARCHAR2,
Numer_wyszukiwania W LICZBIE,
Niezakończony W DOMYŚLNYM ZNAKU FAŁSZ,
Ogranicznik W DOMYŚLNYM VARCHAR2 ',')
NUMER ZWROTU
JEST
BEGIN
RETURN Zlokalizuj (ciąg_źródłowy,
TO_CHAR (numer_wyszukiwania),
Niezakończony,
Ogranicznik);
END Zlokalizuj; /* Numer Wersja */
END; /* Treść */
/

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Funkcja JSON_ARRAYAGG() w Oracle

  2. Jak zmienić język sesji Oracle

  3. Automatyczne generowanie pliku odpowiedzi

  4. Czy można tworzyć typy obiektów Oracle Database w PL/SQL?

  5. Dodaj wskaźnik porządkowy do daty w Oracle