sql >> Database teknologi >  >> RDS >> Oracle

Læs og importer CSV-filer i Oracle PL/SQL effektivt

Eksemplet er givet nedenfor for at læse og importere CSV fil (kommasepareret) i PLSQL. Der er en pakke i Oracle-formerne "D2k_Delimited_String" vi bruger til at læse og importere komma (eller en hvilken som helst afgrænser) afgrænset fil, jeg har også skrevet et indlæg på Oracle Forms for at læse afgrænsede filer med denne pakke, følgende er linket https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Den samme pakke, som jeg konverterede til databasepakke for at læse CSV-fil i PLSQL effektivt, omdøbte jeg pakken til "Plsql_Delimited_String". Nedenstående er et eksempel givet til import af csv-fil i PL SQL ved hjælp af denne pakkefunktion Get_String, følgende er brugen af ​​denne funktion:

Plsql_Delimited_String.Getstring ([streng, der indeholder separeret tekst, hele rækken],
[forekomst],
[utermineret boolesk standardfalsk],
[delemeter]);

I den følgende procedure vil brugeren videregive et filnavn, som skal være i den mappeplacering, der er oprettet i Oracle-biblioteksobjektet, i dette eksempel bruges biblioteksobjektet 'DIN_DIRECTORY', ændre det med dit biblioteksobjekt og kopiere den afgrænsede fil på den placering, og derefter sende filnavnet til denne procedure.

OPRET ELLER ERSTATS PROCEDURE Import_Emp_File (P_FILENAME IN VARCHAR2,
o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
0CHARG2;
0CHARG2 );

-- Feltværdier Array
TYPE Feltværdi ER TABLE OF VARCHAR2 (100)
INDEX BY BINARY_INTEGER;

Field_Position Feltværdi;

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);
-- tilføjelse af ekstra rør i slutningen af ​​linjen for at læse alle felter

Linebuf :=Linebuf || '|';

-- Antag, at filen indeholder seks separerede strenge med rør (|)
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 eksempeltabel
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
VÆRDI (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;
UNDTAGELSE
NÅR ANDRE

-- ignorerer fejl under databaseindsættelse
NULL;
END;
END LOOP;

HVIS UTL_FILE.is_open (infile)

UTL_FILE.Fclose (Infile);
END IF;
UNDTAGELSE
NÅR NO_DATA_FOUND

HVIS UTL_FILE.is_open (infile)

UTL_FILE.Fclose (Infile);
END IF;

IF total_rec_processed> 0
THEN
COMMIT;
END IF;
NÅR ANDRE

HVIS UTL_FILE.is_open (infile)

UTL_FILE.Fclose (Infile);
END IF;

o_msg :=SQLERRM;
END;
/Følgende er pakkekilden til PLSQL_DELIMITED_STRING brugt i dette eksempel, installer denne pakke i dit skema. Pakken indeholder mange andre hjælpefunktioner, som kan bruges til at læse csv-filen ved hjælp af PLSQL:

OPRET ELLER UDSKIFT PAKKE plsql_Delimited_String IS

funktion Tæller( Kildestreng i varchar2,
Utermineret i boolsk standard FALSK,
Afgrænser i varchar2-standard ',') returnerer nummer;
Procedure PutString( Kildestreng i ud varchar2,
String_to_add in varchar2,
Field_position in number,
UnTerminated in boolesk default FALSE,
Delimiter in varchar2 default ',');
Procedure PutNumber( Source_string in out varchar2,
number_to_add i antal,
Feltposition i antal,
Uafsluttet i boolesk standard FALSK,
Afgrænser i varchar2 standard ',');
Procedure PutDate( Kildestreng i ud varchar2,
Dato_to_add in date,
Field_position in number,
Unterminated in Bo olean default FALSE,
Afgrænser i varchar2 standard ',');
funktion GetString( Source_string in varchar2,
Field_position in number,
Unterminated in boolesk default FALSE,
Delimiter i varchar2 standard ',') returner 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 ',') returnedato;
funktion Locate( Source_string in varchar2,
Search_String in varchar2,
Unterminated in Boole en standard FALSK,
Afgrænser i varchar2 standard ',') returner nummer;
funktion Find( Kildestreng i varchar2,
Søg_dato i dato,
Utermineret i boolsk standard FALSK,
Afgrænsningstegn i varchar2 standard ',') returner nummer;
funktion Find( Kildestreng i varchar2,
Søgetal i tal,
Utermineret i boolsk standard FALSK,
Afgrænser i varchar2 standard ',') returnummer;
END plsql_Delimited_String;
/

OPRET ELLER ERSTAT PAKKE BODY plsql_Delimited_String
IS
FUNCTION Counter (Source_string I VARCHAR2,
Uterminated IN BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',') NUMBER.
IS
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BEGIN
HVIS Utermineret

iModifier :=1;
SLUT HVIS;

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 ',')
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. er strengen Zero Length?
HVIS iStrLen =0

HVIS Field_Position> 1

FOR iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Delimiter;
END LOOP;
END IF;

Kildestreng :=vcSepBuffer || String_to_add;

HVIS IKKE Utermineret

Kildestreng :=Kildestreng || Delimiter;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. Håndter uafsluttede strenge
IF UnTerminated
THEN
Kildestreng :=Kildestreng || Delimiter;
END IF;

-- 3. Find nth-1 separatoren
IF Field_Position> 1

LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Delimiter,
1,
Field_Position - 1)
- 1)
+ LENGTH (Delimiter);
EXIT WHEN iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || Delimiter;
END LOOP;

HVIS vcSepBuffer IKKE ER 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);

HVIS iPtrEnd =0

iPtrEnd :=iStrLen;
END IF;
END IF;

-- 3. Genopbyg strengen
Kildestreng :=
SUBSTR (Kildestreng, 1, iPtrStart)
|| vcSepBuffer
|| String_to_add
|| Afgrænsning
|| SUBSTR (Source_string, iPtrEnd + LENGTH (Afgrænser));

-- 4. Sortér opsigelse
HVIS Utermineret

Kildestreng :=
SUBSTR (Kildestreng,
1,
(LÆNGDE (Kildestreng) - LÆNGDE (Afgrænser)));
END IF;
END IF;
END PutString;

PROCEDURE 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. Foretag blot datatypekonverteringer og kald varchar2-varianten af ​​put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
Field_position,
Unterminated,
Delimiter);
END PutNumber;

PROCEDURE 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. Foretag blot datatypekonverteringer og kald varchar2-varianten af ​​put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MAN-ÅÅÅÅ HH24:MI:SS'),
Field_position,
Unterminated,
Delimiter);
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) :=Kildestreng;
BEGIN
HVIS Utermineret

vcSourceStrCopy :=vcSourceStrCopy || Delimiter;
END IF;

HVIS Field_Position> 1

iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (Afgrænser);
ELSE
iPtrStart :=1;
END IF;

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
SLUT GetString; /* String Version */

FUNKTION GetNumber (Kildestreng I VARCHAR2,
Feltposition I TAL,
Uafsluttet I BOOLEAN DEFAULT FALSK,
Delimiter I VARCHAR2 DEFAULT ',')
RETURNUMMER
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');
SLUT GetDate; /* Dato Version */

FUNKTION Find (Kildestreng I VARCHAR2,
Søgestreng I VARCHAR2,
Utermineret I BOOLEAN DEFAULT FALSK,
Afgrænser I VARCHAR2 DEFAULT ',')
RETURNUMMER
ER
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcCompare VARCHAR2 (2000);
BEGIN
FOR 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 Find;

FUNKTION Lokaliser (Kildestreng I VARCHAR2,
Søg_dato IN DATO,
Uafsluttet I BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURNUMMER
IS
BEGIN
RETURN Find (Source_string,
TO_CHAR (Search_date, 'DD-MON-YYYY HH24:MI:SS'),
UnTerminated,
Delimiter);
SLUT Find; /* Dato Version */

FUNKTION Find (Kildestreng I VARCHAR2,
Search_number I NUMBER,
Utermineret I BOOLEAN DEFAULT FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURNUMMER
IS
BEGIN
RETURN Find (Source_string,
TO_CHAR (Search_number),
Unterminated,
Delimiter);
END Locate; /* Nummerversion */
END; /* Brødtekst */
/

  1. Escape SQL LIKE værdi for Postgres med psycopg2

  2. T-SQL Spring over Tag lagret procedure

  3. MySQL versus PDO

  4. Vinduesfunktioner eller almindelige tabeludtryk:tæl tidligere rækker inden for rækkevidde