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:
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 */
/