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
SÅ
-- ignorerer fejl under databaseindsættelse
NULL;
END;
END LOOP;
HVIS UTL_FILE.is_open (infile)
SÅ
UTL_FILE.Fclose (Infile);
END IF;
UNDTAGELSE
NÅR NO_DATA_FOUND
SÅ
HVIS UTL_FILE.is_open (infile)
SÅ
UTL_FILE.Fclose (Infile);
END IF;
IF total_rec_processed> 0
THEN
COMMIT;
END IF;
NÅR ANDRE
SÅ
HVIS UTL_FILE.is_open (infile)
SÅ
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:
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
SÅ
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
SÅ
HVIS Field_Position> 1
SÅ
FOR iCounter IN 2 .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || Delimiter;
END LOOP;
END IF;
Kildestreng :=vcSepBuffer || String_to_add;
HVIS IKKE Utermineret
SÅ
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
SÅ
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
SÅ
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
SÅ
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
SÅ
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
SÅ
vcSourceStrCopy :=vcSourceStrCopy || Delimiter;
END IF;
HVIS Field_Position> 1
SÅ
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
SÅ
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 */
/