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
DÅ
-- 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
DÅ
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
DÅ
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:
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
DÅ
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
DÅ
IF Field_Position> 1
SÅ
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
DÅ
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
DÅ
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
DÅ
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
DÅ
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
DÅ
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 */
/