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

बाहरी तालिका का स्थान और फ़ाइल नाम प्राप्त करना?

मुझे एक्सेस पैरामीटर के भीतर फ़ाइल नाम कैप्चर करने के किसी भी तरीके से अवगत नहीं है। वर्कअराउंड के रूप में, मूल फ़ाइलों को संशोधित करने के बजाय आप फ़्लाई पर फ़ाइल नाम जोड़ने के लिए प्रीप्रोसेसर का उपयोग कर सकते हैं। अगर आपके पास दो फ़ाइलें थीं, तो file_1.csv say कहें a,b,1 . युक्त और file_2.csv जिसमें c,d,2 . है , आपके पास एक छोटी शेल स्क्रिप्ट हो सकती है जैसे append_filename.sh :

#!/bin/bash
while read line
do
  printf "%s,%s\n" "${line}" "${1##*/}"
done < $1

जिसे आप सत्यापित कर सकते हैं कि स्क्रिप्ट को सीधे कॉल करके कुछ मददगार होता है:

$ ./append_filename.sh file_1.csv
a,b,1,file_1.csv

फिर आप अपनी बाहरी तालिका को preprocessor . के माध्यम से कॉल करने के लिए परिभाषित कर सकते हैं खंड, कुछ इस तरह:

create table e42 (
  col1 varchar2(10),
  col2 varchar2(10),
  col3 number,
  filename varchar2(30)
)
organization external (
  type oracle_loader
  default directory d42
  access parameters (
    records delimited by newline
    preprocessor 'append_filename.sh'
    fields terminated by ','
  )
  location ('file_1.csv', 'file_2.csv')
);

Table E42 created.

फिर फ़ाइल का नाम अपने आप उठा लिया जाता है:

select * from e42;

COL1       COL2             COL3 FILENAME                     
---------- ---------- ---------- ------------------------------
a          b                   1 file_1.csv                    
c          d                   2 file_2.csv                    

मैंने निर्देशिका पथ को हटा दिया है ताकि आप केवल फ़ाइल नाम देख सकें - यदि आप चाहें तो आप पूरा पथ रख सकते हैं, लेकिन यह आवश्यक नहीं हो सकता है और उन लोगों को ओएस विवरण प्रकट कर सकता है जो केवल तालिका से पूछ सकते हैं। सुरक्षा दिशानिर्देशों पर ध्यान दें; मैंने सब कुछ के लिए एक निर्देशिका का उपयोग करके इसे सरल रखा है, लेकिन आपको प्रीप्रोसेसर को कहीं और रखना चाहिए। और निश्चित रूप से यह एक यूनिक्स-वाई मंच या जीएनयू उपकरण मान रहा है; यदि आप Windows का उपयोग कर रहे हैं तो बैच फ़ाइल के साथ भी कुछ ऐसा ही संभव होना चाहिए।

लाइन-दर-लाइन पढ़ने का यह तरीका बड़ी फ़ाइलों के लिए अपेक्षाकृत धीमा होगा; फ़ाइल नाम जोड़ने वाली 1.5 मिलियन-पंक्ति परीक्षण फ़ाइल के साथ मेरे प्लेटफ़ॉर्म पर लगभग 80 सेकंड लगे। अन्य अंतर्निर्मित उपकरण तेज़ होंगे; sed . के साथ यह संस्करण एक ही फ़ाइल के लिए बस एक सेकंड से अधिक समय लगता है:

#!/bin/bash
sed -e 's!$!,'"${1##*/}"'!' $1

आप अन्य विकल्प जैसे awk . आज़मा सकते हैं भी; आपके वातावरण में सबसे अच्छा (या पर्याप्त तेज़) क्या काम करता है, यह देखने के लिए आपको शायद कुछ परीक्षण करने की आवश्यकता होगी।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तृतीय-पक्ष क्लाउड पर Oracle RAC

  2. Oracle क्लाइंट स्थापना त्रुटि - पथ बहुत लंबा

  3. Oracle Concatenate स्ट्रिंग और संख्या उदाहरण

  4. दशमलव (एस, पी) या संख्या (एस, पी)?

  5. पैच नीति