sql >> Databasteknik >  >> RDS >> Oracle

Läs och importera CSV-filer i Oracle PL/SQL effektivt

Exemplet ges nedan för att läsa och importera CSV fil (kommaavgränsad) i PLSQL. Det finns ett paket i Oracle-formerna "D2k_Delimited_String" vi använder för att läsa och importera komma (eller någon avgränsare) avgränsad fil, jag har skrivit ett inlägg även på Oracle Forms för att läsa avgränsade filer med detta paket, följande är länken https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Samma paket som jag konverterade till databaspaket för att effektivt läsa CSV-fil i PLSQL, döpte jag om paketet till "Plsql_Delimited_String". Nedan är ett exempel som ges för att importera csv-fil i PL SQL med hjälp av denna paketfunktion Get_String, följande är användningen av denna funktion:

Plsql_Delimited_String.Getstring ([sträng som innehåller avgränsad text, hela raden],
[förekomst],
[oavslutad boolesk standardfalsk],
[delimeter]);

I följande procedur skickar användaren ett filnamn som ska finnas i den katalogplats som skapats i Oracle katalogobjekt, i det här exemplet används katalogobjektet 'DIN_DIRECTORY', ändra det med ditt katalogobjekt och kopiera den avgränsade filen på den platsen och skicka sedan filnamnet till denna procedur.

SKAPA ELLER ERSÄTT PROCEDUR Import_Emp_File (P_FILENAME IN VARCHAR2,
o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
0CHARG2;
0CHARG2 );

-- Fältvärden Array
TYPE Fältvärde IS TABLE OF VARCHAR2 (100)
INDEX BY BINARY_INTEGER;

Field_Position Fältvärde;

Total_Rec_Count NUMBER :=0;
Total_Rec_Processed NUMBER :=0;
BEGIN
Infile :=UTL_FILE.Fopen ('DIN_DIRECTORY', P_FILENAME, 'R');

LOOP
---
UTL_FILE.Get_Line (Infile, Linebuf);
-- lägga till extra pipe i slutet av raden för att läsa alla fält

Linebuf :=Linebuf || '|';

-- Anta att filen innehåller sex avgränsade strängar med pipe (|)
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;

-- en exempeltabell
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
VÄRDEN (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;
UNDANTAG
NÄR ANDRA

-- ignorerar fel under databasinfogning
NULL;
END;
END LOOP;

IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
UNDANTAG
NÄR NO_DATA_FOUND

IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;

IF total_rec_processed> 0
THEN
COMMIT;
END IF;
NÄR ANDRA

IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;

o_msg :=SQLERRM;
END;
/Följande är paketkällan för PLSQL_DELIMITED_STRING som används i det här exemplet, installera detta paket i ditt schema. Paketet innehåller många andra verktygsfunktioner som kan användas för att läsa csv-filen med PLSQL:

SKAPA ELLER ERSÄTT PAKET plsql_Delimited_String IS

funktion Counter( Source_string in varchar2,
UnTerminated in boolesk default FALSE,
Delimiter in varchar2 default ',') return number;
Procedur PutString( Source_string in out varchar2,
String_to_add in varchar2,
Field_position in number,
UnTerminated in boolesk default FALSE,
Avgränsare i varchar2 default ',');
Procedur PutNumber( Source_string in out varchar2,
number_to_add i antal,
Fältposition i antal,
Oavslutad i boolesk standard FALSE,
Avgränsare i varchar2 standard ',');
Procedur PutDate( Source_string in out varchar2,
Date_to_add in date,
Field_position in number,
Unterminated in Bo olean default FALSE,
Avgränsare i varchar2 default ',');
funktion GetString( Source_string i varchar2,
Fältposition i nummer,
UnTerminated i boolesk standard FALSE,
Avgränsare i varchar2 standard ',') returnerar varchar2;
funktion GetNumber( Source_string in varchar2,
Field_position in number,
Unterminated in boolesk default FALSE,
Delimiter in varchar2 default ', ') return number;
funktion GetDate( Source_string in varchar2,
Field_position in number,
Unterminated in boolesk default FALSE,
Delimiter in varchar2 default ',') return date;
function Locate( Source_string in varchar2,
Search_String in varchar2,
UnTerminated in Boole en standard FALSE,
Avgränsare i varchar2 standard ',') returnerar nummer;
funktion Locate( Source_string in varchar2,
Search_date in date,
Unterminated in boolesk default FALSE,
Avgränsare i varchar2 standard ',') returnerar nummer;
funktion Locate( Source_string i varchar2,
Search_number in number,
Unterminated in boolesk default FALSE,
Delimiter in varchar2 default ',') returnummer;
END plsql_Delimited_String;
/

SKAPA ELLER ERSÄTT PACKAGE BODY plsql_Delimited_String
IS
FUNCTION Counter (Source_string I VARCHAR2,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')

IS
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BÖRJA
OM Oavslutad

iModifier :=1;
END IF;

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

PROCEDUR PutString (Source_string IN OUT VARCHAR2,
String_to_add IN VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
IS
iStrLen PLS_INTEGER :=LENGTH (Source_String);
iStrFragLen PLS_INTEGER :=LENGTH (String_to_add);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_INTEGER;
> vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
BEGIN
-- 1. är strängen Zero Length?
IF iStrLen =0

IF Field_Position> 1

FÖR iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Avgränsare;
END LOOP;
END IF;

Source_string :=vcSepBuffer || String_to_add;

OM INTE Oavslutad

Källsträng :=Källsträng || Delimiter;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. Klara av oavslutade strängar
IF UnTerminated
THEN
Källsträng :=Källsträng || Avgränsare;
END IF;

-- 3. Leta reda på nth-1-separatorn
IF Field_Position> 1

LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Delimiter,
1,
Field_Position - 1)
- 1)
+ LENGTH (Delimiter);
AVSLUTA NÄR iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || Avgränsare;
END LOOP;

OM vcSepBuffer INTE ÄR NULL

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 (Source_string,
Delimiter,
1,
Field_Position);

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

-- 3. Bygg om strängen
Source_string :=
SUBSTR (Source_string, 1, iPtrStart)
|| vcSepBuffer
|| String_to_add
|| Avgränsare
|| SUBSTR (Source_string, iPtrEnd + LENGTH (Delimiter));

-- 4. Sortera uppsägning
IF UnTerminated
THEN
Source_string :=
SUBSTR (Source_String,
1,
(LENGTH (Source_string) - LENGTH (Avgränsare)));
END IF;
END IF;
END PutString;

PROCEDUR PutNumber (Source_string IN OUT VARCHAR2,
number_to_add IN NUMBER,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Gör bara datatypkonverteringar och anrop varchar2-varianten av put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
Field_position,
UnTerminated,
Delimiter);
END PutNumber;

PROCEDUR PutDate (Source_string IN OUT VARCHAR2,
Date_to_add IN DATE,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Gör bara datatypkonverteringar och anrop varchar2-varianten av put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MÅN-ÅÅÅÅ HH24:MI:SS'),
Field_position,
Unterminated,
Avgränsare);
END PutDate;

FUNCTION GetString (Source_string I VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
IS
iPtrEnd PLS_INTEGER :=0;
iPtrStart PLS_INTEGER :=0;
vcSourceStrCopy VARCHAR2 (2000) :=Source_string;
BÖRJA
OM Oavslutad

vcSourceStrCopy :=vcSourceStrCopy || Avgränsare;
END IF;

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

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
END GetString; /* Strängversion */

FUNCTION GetNumber (Source_string I VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
iRc PLS_INTEGER;
BEGIN
RETURN TO_NUMBER (GetString (Source_string,
Field_Position,
UnTerminated,
Delimiter));
END GetNumber; /* Nummerversion */

FUNCTION GetDate (Source_string I VARCHAR2,
Field_position IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN DATE
IS
BEGIN
RETURN TO_DATE (GetString (Source_string,
Field_Position,
UnTerminated,
Delimiter), 'DD-MON-YYYY HH24:MI:SS');
END GetDate; /* Datum Version */

FUNCTION Lokalisera (Source_string I VARCHAR2,
Search_String IN VARCHAR2,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURNUMMER
IS
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcCompare VARCHAR2 (2000);
BÖRJA
FÖR iCounter IN 1 .. Counter (Source_String, UnTerminated, Delimiter)
LOOP
IF GetString (Source_String,
iCounter,
UnTerminated,
Delimiter) =Search_String

iHit :=iCounter;
EXIT;
END IF;
END LOOP;

RETURN iHit;
END Lokalisera;

FUNCTION Lokalisera (Source_string I VARCHAR2,
Search_date IN DATE,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURNUMMER
IS
BÖRJA
RETURN Lokalisera (Source_string,
TO_CHAR (Search_date, 'DD-MON-YYYY HH24:MI:SS'),
UnTerminated,
Delimiter);
END Lokalisera; /* Datum Version */

FUNCTION Lokalisera (Source_string I VARCHAR2,
Search_number IN NUMBER,
Unterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
BEGIN
RETURN Lokalisera (Source_string,
TO_CHAR (Search_number),
UnTerminated,
Delimiter);
END Locate; /* Number Version */
END; /* Kropp */
/

  1. Hur man använder Distributed AD för att minska patchtiden i Oracle EBS

  2. OraOLEDB.Oracle-leverantören är inte registrerad på den lokala maskinen

  3. Importera CSV-fil i Oracle Table med hjälp av lagrad procedur

  4. EFTER LOGON(Oracle) trigger i PostgreSQL med tillägg – login_hook