Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ओरेकल पीएल/एसक्यूएल में सीएसवी फाइलों को कुशलतापूर्वक पढ़ें और आयात करें

सीएसवी पढ़ने और आयात करने के लिए उदाहरण नीचे दिया गया है PLSQL में फ़ाइल (अल्पविराम सीमांकित)। Oracle रूपों में एक पैकेज है "D2k_Delimited_String" जिसका उपयोग हम अल्पविराम (या कोई सीमांकक) सीमांकित फ़ाइल को पढ़ने और आयात करने के लिए करते हैं, मैंने इस पैकेज के साथ सीमांकित फ़ाइलों को पढ़ने के लिए Oracle प्रपत्रों पर एक पोस्ट भी लिखा है, निम्नलिखित लिंक है https:/ /www.foxinfotech.in/2013/02/reading-and-importing-comma-delimited.html। पीएलएसक्यूएल में सीएसवी फ़ाइल को कुशलतापूर्वक पढ़ने के लिए मैंने उसी पैकेज को डेटाबेस पैकेज में परिवर्तित किया, मैंने पैकेज को "Plsql_Delimited_String" नाम दिया। नीचे इस पैकेज फ़ंक्शन Get_String की सहायता से PL SQL में csv फ़ाइल आयात करने के लिए एक उदाहरण दिया गया है, इस फ़ंक्शन का उपयोग निम्नलिखित है:

Plsql_Delimited_String.Getstring ([सीमांकित पाठ युक्त स्ट्रिंग, पूरी पंक्ति],
[घटना],
[अनटर्मिनेटेड बूलियन डिफ़ॉल्ट गलत],
[डिलीमीटर]);

निम्नलिखित प्रक्रिया में उपयोगकर्ता एक फ़ाइल नाम पास करेगा जो ओरेकल निर्देशिका ऑब्जेक्ट में बनाई गई निर्देशिका स्थान में होना चाहिए, इस उदाहरण में निर्देशिका ऑब्जेक्ट 'Your_DIRECTORY' का उपयोग किया जाता है, इसे अपनी निर्देशिका ऑब्जेक्ट से बदलें और उस स्थान पर सीमित फ़ाइल की प्रतिलिपि बनाएँ फिर पास करें इस प्रक्रिया के लिए फ़ाइल का नाम।

बनाएं या बदलें प्रक्रिया Import_Emp_File (VARCHAR2 में P_FILENAME,
o_msg OUT VARCHAR2)
IS
फ़ाइल UTL_FILE.File_Type;
Linebuf VARCHAR2 (4000);
V_Getstring VARCHAR2 (100 );

-- फ़ील्ड मान सरणी
TYPE फ़ील्ड मान VARCHAR2 की तालिका है (100)
BINARY_INTEGER द्वारा INDEX;

Field_Position फ़ील्डवैल्यू;

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);
-- सभी क्षेत्रों को पढ़ने के लिए पंक्ति के अंत में अतिरिक्त पाइप जोड़ना

लाइनबफ:=लाइनबफ || '|';

-- मान लीजिए फ़ाइल में पाइप के साथ छह सीमांकित तार हैं (|)
FOR I IN 1 .. 6
LOOP
Field_Position (I) :=
Plsql_Delimited_String.Getstring (Linebuf) ,
मैं,
FALSE,
'|');
END LOOP;

BEGIN
Total_Rec_Count :=Total_Rec_Count + 1;

-- एक उदाहरण तालिका
INSERT INTO EMP (EMPLOYEE_NUMBER,
FIRST_NAME,
LAST_NAME,
DATE_OF_JOIN,
EMP_TYPE,
DATE_OF_REGN)
VALUES (फ़ील्ड_पोज़िशन (1),
फ़ील्ड_पोज़िशन (2),
फ़ील्ड_पोज़िशन (3),
फ़ील्ड_पोज़िशन (4),
फ़ील्ड_पोज़िशन (5),
फ़ील्ड_पोज़िशन (6) );

Total_Rec_Processed :=Total_Rec_Processed + 1;
अपवाद
जब अन्य
तब
-- डेटाबेस प्रविष्टि के दौरान त्रुटि को अनदेखा करना
NULL;
END;
अंत लूप;

अगर UTL_FILE.is_open (infile)
तब
UTL_FILE.Fclose (Infile);
END IF;
EXCEPTION
जब NO_DATA_FOUND
तब
अगर UTL_FILE.is_open (infile)
तब
UTL_FILE.Fclose (Infile);
END IF;

IF Total_rec_processed> 0
तब
COMMIT;
END IF;
जब अन्य
तब
IF UTL_FILE.is_open (infile)
तब
UTL_FILE.Fक्लोज़ (इनफाइल);
END IF;

o_msg :=SQLERRM;
END;
/इस उदाहरण में प्रयुक्त PLSQL_DELIMITED_STRING का पैकेज स्रोत निम्नलिखित है, इस पैकेज को अपने स्कीमा में स्थापित करें। पैकेज में कई अन्य उपयोगिता फ़ंक्शन शामिल हैं जिनका उपयोग PLSQL का उपयोग करके csv फ़ाइल को पढ़ने के लिए किया जा सकता है:

पैकेज बनाएं या बदलें plsql_Delimited_String IS

फ़ंक्शन काउंटर (varchar2 में Source_string,
बूलियन डिफ़ॉल्ट FALSE में समाप्त नहीं हुआ,
varchar2 डिफ़ॉल्ट ',' में डिलीमीटर) वापसी संख्या; varchar2,
संख्या में Field_position,
बूलियन डिफ़ॉल्ट FALSE में समाप्त नहीं,
varchar2 डिफ़ॉल्ट ',' में सीमांकक);
प्रक्रिया PutNumber( Source_string आउट varchar2,
number_to_add संख्या में,
संख्या में फ़ील्ड_स्थिति,
बूलियन डिफ़ॉल्ट में समाप्त FALSE,
varchar2 डिफ़ॉल्ट ',' में सीमांकक);
प्रक्रिया PutDate( Source_string in out varchar2,
Date_to_add in date,
Field_position in number,
Bo में समाप्त नहीं हुआ olean डिफ़ॉल्ट FALSE,
varchar2 डिफ़ॉल्ट ',' में सीमांकक);
फ़ंक्शन GetString(varchar2 में Source_string,
संख्या में फ़ील्ड_स्थिति,
बूलियन डिफ़ॉल्ट FALSE में समाप्त नहीं,
varchar2 डिफ़ॉल्ट ',') में डिलीमीटर varchar2 लौटाता है; ') वापसी संख्या;
फ़ंक्शन GetDate( Source_string in varchar2,
संख्या में फ़ील्ड_स्थिति,
बूलियन डिफ़ॉल्ट FALSE में समाप्त नहीं,
varchar2 डिफ़ॉल्ट ',' में सीमांकक) वापसी की तारीख;
फ़ंक्शन पता लगाएँ (varchar2 में Source_string,
varchar2 में Search_String,
Boole में समाप्त नहीं हुआ एक डिफ़ॉल्ट FALSE,
varchar2 में डिलीमीटर डिफ़ॉल्ट ',') वापसी संख्या;
फ़ंक्शन पता लगाएँ (varchar2 में Source_string,
दिनांक में Search_date,
बूलियन डिफ़ॉल्ट FALSE में समाप्त नहीं,
varchar2 डिफॉल्ट ',') रिटर्न नंबर में डिलीमीटर;
फंक्शन लोकेट (varchar2 में Source_string,
सर्च_नंबर इन नंबर,
बूलियन डिफॉल्ट FALSE में अनटर्मिनेटेड,
varchar2 डिफॉल्ट में डिलीमीटर ',') वापसी संख्या;
END plsql_Delimited_String;
/

पैकेज बॉडी बनाएं या बदलें plsql_Delimited_String
IS
फंक्शन काउंटर (VARCHAR2 में Source_string,
बूलियन डिफॉल्ट FALSE में अनटर्मिनेटेड,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
iModifier PLS_INTEGER :=0;
iOldSize PLS_INTEGER :=LENGTH (Source_string);
BEGIN
IF अनटर्मिनेटेड
फिर
iModifier :=1;
END IF;

रिटर्न (iOldSize - LENGTH (REPLACE (Source_string, Delimiter)))
+ iModifier;
END काउंटर;

प्रक्रिया PutString (VARCHAR2 में Source_string,
VARCHAR2 में String_to_add,
NUMBER में Field_position,
बूलियन डिफ़ॉल्ट FALSE में समाप्त,
VARCHAR2 DEFAULT ',' में सीमांकक)
IS
iStrLen PLS_INTEGER :=LENGTH (Source_String);
iStrFragLen PLS_INTEGER :=LENGTH (String_to_add);
iPtrStart PLS_INTEGER :=0;
iPtrEnd PLS_INTEGER /:=0;
> vcSepBuffer VARCHAR2 (2000);
iCounter PLS_INTEGER;
BEGIN
-- 1. क्या स्ट्रिंग की लंबाई शून्य है?
अगर iStrLen =0
तब
IF Field_Position> 1
तब
iCounter IN 2 के लिए .. Field_Position
LOOP
vcSepBuffer :=vcSepBuffer || सीमांकक;
END LOOP;
END IF;

Source_string :=vcSepBuffer || String_to_add;

अगर समाप्त नहीं हुआ
तो
Source_string :=Source_String || सीमांकक;
iStrLen :=LENGTH (Source_string);
END IF;
ELSE
-- 2. अनटर्मिनेटेड स्ट्रिंग्स से निपटें
अगर अनटर्मिनेटेड
तब<ब्र /> Source_string :=Source_string || सीमांकक;
END IF;

-- 3. nth-1 विभाजक का पता लगाएं
IF Field_Position> 1
तब
LOOP
iPtrStart :=
(INSTR (Source_string || vcSepBuffer,
सीमांकक,
1,
Field_Position - 1)
- 1)
+ LENGTH (सीमांकक);
जब iPtrStart> 0;
vcSepBuffer :=vcSepBuffer || सीमांकक;
END LOOP;

अगर vcSepBuffer खाली नहीं है
तब
iPtrEnd :=iStrLen;
ELSE
iPtrEnd :=
INSTR (Source_string,
Delimiter,
1 ,
Field_Position);

अगर iPtrEnd =0
तब
iPtrEnd :=iStrLen;
END IF;
END IF;
ELSE
iPtrStart :=0;
iPtrEnd :=
INSTR (Source_string,
Delimiter,
1,
Field_Position);

अगर iPtrEnd =0
तब
iPtrEnd :=iStrLen;
END IF;
END IF;

-- 3. स्ट्रिंग का पुनर्निर्माण करें
Source_string :=
SUBSTR (Source_string, 1, iPtrStart)
|| vcSepBuffer
|| String_to_add
|| सीमांकक
|| SUBSTR (सोर्स_स्ट्रिंग, iPtrEnd + LENGTH (डिलीमीटर));

-- 4. टर्मिनेशन को सॉर्ट करें
अगर अनटर्मिनेटेड
तब
Source_string :=
SUBSTR (Source_String,
1,
(LENGTH (Source_string) - LENGTH (सीमांकक)));
END IF;
END IF;
END PutString;

प्रक्रिया PutNumber (सोर्स_स्ट्रिंग आउट VARCHAR2,
number_to_add में NUMBER,
NUMBER में Field_position,
BOOLEAN DEFAULT FALSE में अनटर्मिनेटेड,
Delimiter IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. बस डेटाटाइप रूपांतरण करें और पुट के varchar2 संस्करण को कॉल करें..
plsql_Delimited_String.PutString (Source_string,
TO_CHAR (number_to_add),
फील्ड_पोजिशन,
अनटर्मिनेटेड,
डिलीमीटर);
END PutNumber;

प्रक्रिया PutDate (सोर्स_स्ट्रिंग आउट VARCHAR2,
Date_to_add IN DATE,
Field_position IN NUMBER,
अनटर्मिनेटेड इन बूलियन डिफॉल्ट FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
IS
BEGIN
-- 1. बस डेटाटाइप रूपांतरण करें और पुट के varchar2 संस्करण को कॉल करें..
plsql_Delimited_String.
PutString (Source_string,
TO_CHAR (date_to_add, ' DD-MON-YYYY HH24:MI:SS'),
Field_position,
UnTerminating,
Delimiter);
END PutDate;

FUNCTION GetString (VARCHAR2 में Source_string,
NUMBER में Field_position,
BOOLEAN DEFAULT FALSE में अनटर्मिनेटेड,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN VARCHAR2
IS
iPtrEnd PLS_INTEGER:=0;> vcSourceStrCopy :=vcSourceStrCopy || सीमांकक;
END IF;

IF Field_Position> 1
तब
iPtrStart :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position - 1)
+ LENGTH (सीमांकक);
ELSE
iPtrStart :=1;
END IF;

iPtrEnd :=
INSTR (vcSourceStrCopy,
Delimiter,
1,
Field_Position);
रिटर्न सब्सट्र (vcSourceStrCopy, iPtrStart, (iPtrEnd - iPtrStart));
गेटस्ट्रिंग समाप्त करें; /* स्ट्रिंग संस्करण */

FUNCTION GetNumber (VARCHAR2 में Source_string,
NUMBER में Field_position,
BOOLEAN DEFAULT FALSE में अनटर्मिनेटेड,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
iRc PLS_INTEGER;
BEGIN
RETURN TO_NUMBER (GetString (Source_string,
Field_Position,
UnTerminating,
Delimiter));
END GetNumber; /* संख्या संस्करण */

FUNCTION GetDate (VARCHAR2 में Source_string,
NUMBER में Field_position,
BOOLEAN DEFAULT FALSE में अनटर्मिनेटेड,
Delimiter IN VARCHAR2 DEFAULT ',')
रिटर्न डेट
IS
BEGIN
TO_DATE पर लौटें (GetString (Source_string,
Field_Position,
UnTerminating,
Delimiter), 'DD-MON-YYYY HH24:MI:SS');
END GetDate; /* दिनांक संस्करण */

फ़ंक्शन पता लगाएँ (VARCHAR2 में Source_string,
Search_String में VARCHAR2,
बूलियन डिफॉल्ट FALSE में समाप्त,
VARCHAR2 DEFAULT ',' में डिलीमीटर)
रिटर्न नंबर
IS
iHit PLS_INTEGER :=0;
iCounter PLS_INTEGER;
vcतुलना VARCHAR2 (2000);
BEGIN
for iCounter IN 1 .. काउंटर (सोर्स_स्ट्रिंग, अनटर्मिनेटेड, डिलीमीटर)
LOOP
IF GetString (Source_String,
iCounter,
UnTerminating,
Delimiter) =Search_String
THEN
iHit :=iCounter;
EXIT;
END IF;
END LOOP;

रिटर्न iHit;
एंड लोकेट;

फंक्शन लोकेट (सोर्स_स्ट्रिंग इन VARCHAR2,
Search_date IN DATE,
अनटर्मिनेटेड इन बूलियन डिफॉल्ट FALSE,
Delimiter IN VARCHAR2 DEFAULT ',')
RETURN NUMBER
IS
BEGIN
वापसी का पता लगाएँ (सोर्स_स्ट्रिंग,
TO_CHAR (Search_date, 'DD-MON-YYYY HH24:MI:SS'),
अनटर्मिनेटेड,
Delimiter);
अंत पता लगाएँ; /* दिनांक संस्करण */

फ़ंक्शन पता लगाएँ (VARCHAR2 में Source_string,
NUMBER में Search_number,
बूलियन डिफ़ॉल्ट FALSE में समाप्त,
VARCHAR2 DEFAULT ',' में डिलीमीटर)
रिटर्न नंबर
IS
BEGIN
वापसी का पता लगाएँ (सोर्स_स्ट्रिंग,
TO_CHAR (Search_number),
अनटर्मिनेटेड,
डिलीमीटर);
END पता लगाएँ; /* संख्या संस्करण */
END; /* शरीर */
/

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. TO_YMINTERVAL () Oracle में फ़ंक्शन

  2. Oracle 11g . में पिवट

  3. Oracle के साथ AWS पायथन लैम्ब्डा

  4. PDB अनप्लग ORA-17528 त्रुटि

  5. हाइबरनेट डेटाबेस से अनुक्रम सूचना प्राप्त नहीं कर सका