sql >> Database >  >> RDS >> Oracle

CSV-bestanden efficiënt lezen en importeren in Oracle PL/SQL

Het voorbeeld wordt hieronder gegeven om CSV te lezen en importeren bestand (door komma's gescheiden) in PLSQL. Er is een pakket in Oracle-formulieren "D2k_Delimited_String" die we gebruiken om door komma's (of een scheidingsteken) gescheiden bestand te lezen en te importeren, ik heb ook een bericht op Oracle Forms geschreven om gescheiden bestanden met dit pakket te lezen, het volgende is de link https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html. Hetzelfde pakket dat ik heb geconverteerd naar een databasepakket om het CSV-bestand in PLSQL efficiënt te lezen, heb ik het pakket hernoemd naar "Plsql_Delimited_String". Hieronder is een voorbeeld gegeven om een ​​csv-bestand in PL SQL te importeren met behulp van deze pakketfunctie Get_String, het volgende is het gebruik van deze functie:

Plsql_Delimited_String.Getstring ([string met tekst met scheidingstekens, de hele rij],
[occurance],
[unterminated boolean default false],
[delimeter]);

In de volgende procedure zal de gebruiker een bestandsnaam doorgeven die in de directory-locatie moet staan ​​die is gemaakt in het Oracle-directory-object, in dit voorbeeld wordt directory-object 'YOUR_DIRECTORY' gebruikt, verander het met uw directory-object en kopieer het gescheiden bestand op die locatie en geef vervolgens door de bestandsnaam voor deze procedure.

PROCEDURE MAKEN OF VERVANGEN Import_Emp_File (P_FILENAME IN VARCHAR2,
o_msg OUT VARCHAR2)
IS
Infile UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
V_Getstring VARCHAR2 (100 );

-- Veldwaarden Array
TYPE Veldwaarde IS TABEL VAN VARCHAR2 (100)
INDEX BY BINARY_INTEGER;

Field_Position Veldwaarde;

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);
-- extra pijp aan het einde van de regel toevoegen om alle velden te lezen

Linebuf :=Linebuf || '|';

-- Stel dat het bestand zes gescheiden strings bevat met pijp (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf ,
I,
ONWAAR,
'|');
EINDE LUS;

BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;

-- een voorbeeldtabel
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;
UITZONDERING
WHEN OTHERS
THEN
-- fout negeren tijdens het invoegen van de database
NULL;
END;
EINDE LUS;

IF UTL_FILE.is_open (infile)
THEN
UTL_FILE.Fclose (Infile);
END IF;
UITZONDERING
WANNEER GEEN_DATA_FOUND
DAN
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;
/Het volgende is de pakketbron van PLSQL_DELIMITED_STRING die in dit voorbeeld wordt gebruikt, installeer dit pakket in uw schema. Het pakket bevat vele andere hulpprogramma's die kunnen worden gebruikt om het csv-bestand te lezen met behulp van PLSQL:

MAAK OF VERVANG PAKKET plsql_Delimited_String IS

function Counter( Source_string in varchar2,
UnTerminated in Boolean default FALSE,
Scheidingsteken 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,
Scheidingsteken in varchar2 default ',');
Procedure PutNumber( Source_string in out varchar2,
number_to_add in getal,
Veld_positie in getal,
UnTerminated in Boolean default FALSE,
Scheidingsteken in varchar2 default ',');
Procedure PutDate( Source_string in out varchar2,
Date_to_add in date,
Field_position in number,
UnTerminated in Bo olean default FALSE,
Scheidingsteken in varchar2 default ',');
function GetString( Source_string in varchar2,
Field_position in number,
UnTerminated in Boolean default FALSE,
Scheidingsteken in varchar2 default ',') return varchar2;
functie GetNumber( Source_string in varchar2,
Field_position in number,
UnTerminated in Boolean default FALSE,
Scheidingsteken in varchar2 default ', ') return number;
functie GetDate( Source_string in varchar2,
Field_position in number,
UnTerminated in Boolean default FALSE,
Scheidingsteken in varchar2 default ',') return date;
functie Locate( Source_string in varchar2,
Search_String in varchar2,
UnTerminated in Boole an default FALSE,
Scheidingsteken in varchar2 default ',') return number;
function Locate( Source_string in varchar2,
Search_date in date,
UnTerminated in Boolean default FALSE,
Scheidingsteken in varchar2 standaard ',') retourneert getal;
functie Locate( Source_string in varchar2,
Zoeknummer in getal,
UnTerminated in Booleaanse standaard FALSE,
Scheidingsteken in varchar2 standaard ',') retournummer;
END plsql_Delimited_String;
/

MAAK OF VERVANG PAKKETBODY plsql_Delimited_String
IS
FUNCTION Counter (Source_string IN VARCHAR2,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 STANDAARD ',')
TERUG NUMMER
IS
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BEGIN
INDIEN niet beëindigd
DAN
iModifier:=1;
EINDE ALS;

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,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
IS
iStrLen PLS_INTEGER :=LENGTH (Bron_String);
iStrFragLen PLS_INTEGER :=LENGTH (String_to_add);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_INTEGER /:> vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
BEGIN
-- 1. is de string Zero Length?
IF iStrLen =0
THEN
IF Field_Position> 1
DAN
VOOR iCounter IN 2 .. Field_Position
LUS
vcSepBuffer :=vcSepBuffer || Scheidingsteken;
END LOOP;
END IF;

Source_string :=vcSepBuffer || String_to_add;

IF NOT UnTerminated
DAN
Source_string :=Source_String || Scheidingsteken;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. Omgaan met niet-afgesloten strings
IF UnTerminated
THEN
Source_string :=Source_string || Scheidingsteken;
END IF;

-- 3. Zoek het scheidingsteken nth-1
IF Field_Position> 1
THEN
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
Scheidingsteken,
1,
Field_Position - 1)
- 1)
+ LENGTH (scheidingsteken);
VERLATEN WANNEER iPtrStart> 0;
vcSepBuffer:=vcSepBuffer || Scheidingsteken;
END LOOP;

ALS vcSepBuffer NIET NULL IS
DAN
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (Bron_string,
Scheidingsteken,
1 ,
Field_Position);

IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
EINDE ALS;
EINDE ALS;
ANDERS
iPtrStart :=0;
iPtrEnd :=
INSTR (Source_string,
Scheidingsteken,
1,
Field_Position);

IF iPtrEnd =0
THEN
iPtrEnd :=iStrLen;
EINDE ALS;
EINDE ALS;

-- 3. Herbouw de string
Source_string :=
SUBSTR (Source_string, 1, iPtrStart)
|| vcSepBuffer
|| String_to_add
|| Scheidingsteken
|| SUBSTR (Source_string, iPtrEnd + LENGTH (scheidingsteken));

-- 4. Beëindiging uitzoeken
IF UnTerminated
THEN
Source_string :=
SUBSTR (Source_String,
1,
(LENGTH (Source_string) - LENGTH (scheidingsteken)));
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,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. Voer gewoon datatype-conversies uit en roep de varchar2 varsion van put..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
Field_position,
UnTerminated,
Scheidingsteken);
END PutNumber;

PROCEDURE PutDate (Source_string IN OUT VARCHAR2,
Date_to_add IN DATE,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 STANDAARD ',')
IS
BEGIN
-- 1. Voer gewoon datatype-conversies uit en roep de varchar2 varsion van put..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MON-YYYY HH24:MI:SS'),
Field_position,
UnTerminated,
Scheidingsteken);
END PutDate;

FUNCTIE GetString (Source_string IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
IS
iPtrEnd PLS_INTEGER :=0;
iPtrStart PLS_INTEGER :=0;
vcSourceStrCopy VARCHAR2 (2000):=Source_string;
BEGIN
IF UnTerminated
DAN
vcSourceStrCopy :=vcSourceStrCopy || Scheidingsteken;
END IF;

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

iPtrEnd :=
INSTR (vcSourceStrCopy,
Scheidingsteken,
1,
Field_Position);
RETURN SUBSTR (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
EINDE GetString; /* Stringversie */

FUNCTIE GetNumber (Source_string IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
iRc PLS_INTEGER;
BEGIN
RETURN TO_NUMBER (GetString (Source_string,
Field_Position,
UnTerminated,
Scheidingsteken));
END GetNumber; /* Nummer Versie */

FUNCTIE GetDate (Source_string IN VARCHAR2,
Field_position IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETOURDATUM
IS
BEGIN
TERUGKEER NAAR_DATE (GetString (Source_string,
Field_Position,
UnTerminated,
Scheidingsteken), 'DD-MON-YYYY HH24:MI:SS');
EINDE GetDate; /* Datum Versie */

FUNCTIE Lokaliseren (Source_string IN VARCHAR2,
Search_String IN VARCHAR2,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcCompare VARCHAR2 (2000);
BEGIN
VOOR iCounter IN 1. Teller (Bron_String, UnTerminated, Delimiter)
LOOP
IF GetString (Source_String,
iCounter,
UnTerminated,
Scheidingsteken) =Search_String
THEN
iHit :=iCounter;
VERLATEN;
EINDE ALS;
EINDE LUS;

RETURN iHit;
EINDE Lokaliseren;

FUNCTIE Lokaliseren (Source_string IN VARCHAR2,
Search_date IN DATE,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
BEGIN
RETURN Lokaliseren (Source_string,
TO_CHAR (Search_date, 'DD-MON-YYYY HH24:MI:SS'),
UnTerminated,
Scheidingsteken);
> EINDE Lokaliseren; /* Datum Versie */

FUNCTIE Zoek (Source_string IN VARCHAR2,
Zoeknummer IN NUMBER,
UnTerminated IN BOOLEAN DEFAULT FALSE,
Scheidingsteken IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
BEGIN
RETURN Lokaliseren (Bron_string,
TO_CHAR (Zoeknummer),
UnTerminated,
Scheidingsteken);
END Lokaliseren; /* Nummer Versie */
END; /* Hoofdtekst */
/

  1. PHP PDO voorbereide verklaringen

  2. Hoe snel is ODBC precies? Een "geladen" vergelijking.

  3. INSERT ... OP DUPLICATE KEY UPDATE met WAAR?

  4. Cloud Vendor Deep-Dive:PostgreSQL op Google Cloud Platform (GCP)