sql >> Databáze >  >> RDS >> Oracle

Efektivní čtení a import souborů CSV v Oracle PL/SQL

Níže je uveden příklad pro čtení a import CSV soubor (oddělený čárkou) v PLSQL. Ve formulářích Oracle existuje balíček "D2k_Delimited_String", který používáme ke čtení a importu souboru odděleného čárkou (nebo libovolným oddělovačem), napsal jsem příspěvek také na Oracle Forms pro čtení souborů s oddělovači s tímto balíčkem, následující je odkaz https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Stejný balíček, který jsem převedl na databázový balíček, abych efektivně četl soubor CSV v PLSQL, jsem přejmenoval balíček na "Plsql_Delimited_String". Níže je uveden příklad importu souboru csv do PL SQL pomocí této funkce balíčku Get_String, následující je použití této funkce:

Plsql_Delimited_String.Getstring ([řetězec obsahující text s oddělovači, celý řádek],
[výskyt],
[unterminated boolean default false],
[delimeter]);

V následujícím postupu uživatel předá název souboru, který by měl být v umístění adresáře vytvořeném v objektu adresáře Oracle, v tomto příkladu je použit objekt adresáře 'YOUR_DIRECTORY', změňte jej pomocí objektu adresáře a zkopírujte soubor s oddělovači v tomto umístění, poté předejte název souboru tohoto postupu.

POSTUP VYTVOŘENÍ NEBO NAHRAZENÍ Import_Emp_File (P_FILENAME IN VARCHAR2,
o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
VRS12 );

-- Hodnoty pole Pole
TYP Hodnota pole JE TABULKA VARCHAR2 (100)
INDEX PODLE BINARY_INTEGER;

Field_Position Hodnota pole;

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);
-- přidání další svislé čáry na konec řádku pro čtení všech polí

Linebuf :=Linebuf || '|';

-- Předpokládejme, že soubor obsahuje šest oddělených řetězců se svislou čarou (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf ,
I,
FALSE,
'|');
END LOOP;

BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;

-- příklad tabulky
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
VALUES (field_position (1),
field_position (2),
field_position (3),
field_position (4),
field_position (5),
field_position (6) );

Total_Rec_Processed :=Total_Rec_Processed + 1;
VÝJIMKA
KDYŽ OSTATNÍ
THEN
-- ignorování chyby při vkládání databáze
NULL;
END;
KONEC SMYČKY;

IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
VÝJIMKA
KDYŽ NENASLEDOVALA ŽÁDNÁ_DATA
THEN
IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;

IF total_rec_processed> 0
THEN
COMMIT;
END IF;
WHEN OTHERS
THEN
IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;

o_msg :=SQLERRM;
END;
/Následuje zdroj balíčku PLSQL_DELIMITED_STRING použitý v tomto příkladu, nainstalujte tento balíček do schématu. Balíček obsahuje mnoho dalších pomocných funkcí, které lze použít ke čtení souboru csv pomocí PLSQL:

VYTVOŘTE NEBO VYMĚŇTE BALÍČEK plsql_Delimited_String IS

function Counter( Source_string in varchar2,
Unterminated in Boolean default FALSE,
Delimiter in varchar2 default ',') return number;
Procedure PutString( Source_string in out varchar2,
String_to_add in varchar2,
Field_position in number,
Unterminated in Boolean default FALSE,
Delimiter in varchar2 default ',');
Procedure PutNumber( Source_string in out varchar2,
number_to_add v čísle,
Pozice_pole v čísle,
Neukončeno v booleovských výchozích FALSE,
Oddělovač ve výchozím nastavení varchar2 ',');
Procedura PutDate( Zdrojový_řetězec v mimo varchar2,
Date_to_add in date,
Field_position in number,
UnTerminated in Bo olean default FALSE,
Delimiter in varchar2 default ',');
function GetString( Source_string in varchar2,
Field_position in number,
Unterminated in Boolean default FALSE,
Oddělovač ve výchozím nastavení varchar2 ',') return varchar2;
funkce GetNumber( Zdrojový_řetězec ve varchar2,
Umístění_pole v čísle,
Neukončeno v booleovském výchozím nastavení FALSE,
Oddělovač ve výchozím nastavení varchar2 ', ') návratové číslo;
funkce GetDate( Zdrojový_řetězec ve varchar2,
Pozice_pole v čísle,
Neukončeno v logických výchozích hodnotách FALSE,
Oddělovač ve výchozím nastavení varchar2 ',') návratové datum;
function Locate( Source_string in varchar2,
Search_String in varchar2,
UnTerminated in Boole výchozí FALSE,
Oddělovač ve varchar2 výchozí ',') vrátí číslo;
funkce Locate( Zdrojový_řetězec ve varchar2,
Datum hledání v datu,
Neukončeno v booleovských výchozích FALSE,
Oddělovač ve výchozím nastavení varchar2 ',') vrátí číslo;
funkce Locate( Zdrojový_řetězec ve varchar2,
Číslo hledání v čísle,
Neukončeno v booleovských výchozích FALSE,
Výchozí oddělovač ve varchar2 ',') návratové číslo;
END plsql_Delimited_String;
/

VYTVOŘTE NEBO NAHRAĎTE TĚLO BALÍKU plsql_Delimited_String
JE
Počítadlo FUNKCÍ (Zdrojový_řetězec V VARCHAR2,
Neukončen V BOOLEAN VÝCHOZÍ FALSE,
Oddělovač V VARCHAR2 VÝCHOZÍ /> ČÍSLO ',')
JE
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BEGIN
IF Unterminated
THEN
iModifier :=1;
END IF;

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

PROCEDURE PutString (Source_string IN OUT VARCHAR2,
String_to_add IN VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
JE
iStrLen PLS_INTEGER :=LENGTH (zdrojový_řetězec);
iStrFragLen PLS_INTEGER :=LENGTH (řetězec_přidat);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_INTEGER:=0;> vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
ZAČÁTEK
-- 1. je řetězec nulové délky?
POKUD iStrLen =0
THEN
IF Field_Position> 1
THEN
PRO iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Oddělovač;
END LOOP;
END IF;

Source_string :=vcSepBuffer || String_to_add;

POKUD NENÍ Neukončeno
TAK
Zdrojový_řetězec :=Zdrojový_řetězec || Oddělovač;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. Vypořádejte se s neukončenými řetězci
IF UnTerminated
THEN
Zdrojový_řetězec :=Zdrojový_řetězec || Oddělovač;
END IF;

-- 3. Najděte oddělovač n-tých 1
IF Field_Position> 1
THEN
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Delimiter,
1,
Field_Position - 1)
- 1)
+ LENGTH (Delimiter);
EXIT WHEN iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || Oddělovač;
END LOOP;

POKUD NENÍ vcSepBuffer NULL
THEN
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (Source_string,
Delimiter,
1 ,
Field_Position);

IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
END IF;
END IF;
ELSE
iPtrStart :=0;
iPtrEnd :=
INSTR (zdrojový_řetězec,
oddělovač,
1,
Field_Position);

IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
END IF;
END IF;

-- 3. Znovu sestavte řetězec
Zdrojový_řetězec :=
SUBSTR (Zdrojový_řetězec, 1, iPtrStart)
|| vcSepBuffer
|| String_to_add
|| Oddělovač
|| SUBSTR (zdrojový_řetězec, iPtrEnd + LENGTH (oddělovač));

-- 4. Vyřaďte ukončení
IF Unterminated
THEN
Zdrojový_řetězec :=
SUBSTR (Zdrojový_řetězec,
1,
(DÉLKA (Zdrojový_řetězec) - DÉLKA (Oddělovač)));
END IF;
END IF;
END PutString;

PROCEDURE PutNumber (Zdrojový_řetězec IN OUT VARCHAR2,
číslo_k_přidání IN NUMBER,
Pozice_pole V ČÍSLE,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Stačí provést konverze datových typů a zavolat varchar2 variantu put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
Field_position,
UnTerminated,
Delimiter);
END PutNumber;

PROCEDURE PutDate (Zdrojový_řetězec IN OUT VARCHAR2,
Datum_k_přidání IN DATE,
Pozice_pole V ČÍSLE,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Stačí provést konverze datových typů a zavolat varchar2 variantu put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MON-YYYY HH24:MI:SS'),
Field_position,
UnTerminated,
Delimiter);
END PutDate;

FUNCTION GetString (Source_string IN VARCHAR2,
Field_position IN NUMBER,
Untermined IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
IS
iPtrEnd PLS_INTEGER :=0;
iPtrStart PLS_INTEGER :=0;
vcSourceStrCopy VARCHAR2 (2000) :=Source_string;
BEGIN
POKUD neukončeno
THEN
vcSourceStrCopy :=vcSourceStrCopy || Oddělovač;
END IF;

IF Field_Position> 1
THEN
iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (Delimiter);
ELSE
iPtrStart :=1;
END IF;

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
END GetString; /* Verze řetězce */

FUNCTION GetNumber (Zdrojový_řetězec V VARCHAR2,
Pozice_pole V ČÍSLE,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
NÁVRATNÉ ČÍSLO
JE
iRc PLS_INTEGER;
BEGIN
RETURN TO_NUMBER (GetString (Source_string,
Field_Position,
UnTerminated,
Delimiter));
END GetNumber; /* Verze čísla */

FUNCTION GetDate (Zdrojový_řetězec V VARCHAR2,
Pozice_pole V ČÍSLE,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
DATUM NÁVRATNOSTI
JE
BEGIN
RETURN TO_DATE (GetString (Source_string,
Field_Position,
UnTerminated,
Delimiter), 'DD-MON-YYYY HH24:MI:SS');
END GetDate; /* Datum Verze */

FUNCTION Locate (Zdrojový_řetězec V VARCHAR2,
Vyhledávací_řetězec V VARCHAR2,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
NÁVRATNÉ ČÍSLO
JE
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcCompare VARCHAR2 (2000);
BEGIN
PRO iCounter IN 1 .. Counter (Source_String, UnTerminated, Delimiter)
LOOP
IF GetString (Source_String,
iCounter,
UnTerminated,
Delimiter) =Search_String
THEN
iHit :=iCounter;
EXIT;
END IF;
END LOOP;

RETURN iHit;
END Locate;

FUNKCE Lokalizujte (zdrojový_řetězec V VARCHAR2,
Datum_vyhledání V DATUM,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
NÁVRATNÉ ČÍSLO
JE
BEGIN
RETURN Locate (zdrojový_řetězec,
TO_CHAR (vyhledávací_datum, 'DD-MON-YYYY HH24:MI:SS'),
UnTerminated,
Delimiter);
KONEC Najděte; /* Datum Verze */

FUNCTION Lokalizujte (zdrojový_řetězec V VARCHAR2,
Hledané_číslo V ČÍSLE,
Neukončeno V BOOLEAN DEFAULT FALSE,
Oddělovač V VARCHAR2 DEFAULT ',')
NÁVRATNÉ ČÍSLO
JE
BEGIN
RETURN Locate (Source_string,
TO_CHAR (Search_number),
UnTerminated,
Delimiter);
END Locate; /* Verze čísla */
END; /* Tělo */
/

  1. SQL Server 2005 Použití DateAdd k přidání dne k datu

  2. Funkce MySQL ATAN() – vrátí arc tangens hodnoty (nebo hodnot)

  3. Jak používat šablony v SQL Server Management Studio (SSMS) - SQL Server / Výukový program TSQL, část 16

  4. Zvýšení výkonu pomocí čtení a zápisu rozdělení databázového provozu s Moodle 3.9