2013-01-25 14 views
11

मैं लोड डेटा इन्फाइल में फ़ाइल नाम के रूप में एक चर का उपयोग करना चाहता हूं। चलाने के बाद दुर्भाग्य सेलोड डेटा इन्फाइल @ अविभाज्य त्रुटि में

Set @d1 = 'C:/Users/name/Desktop/MySQL/1/'; 
Set @d2 = concat(@d1, '20130114.txt'); 
load data local infile @d2 into table Avaya_test (Agent_Name, Login_ID,ACD_Time); 

, वहाँ नीचे की तरह commment के साथ एक त्रुटि है:: मैं एक नीचे कोड चलाने "त्रुटि कोड: 1064. आप अपने एसक्यूएल वाक्य रचना में एक त्रुटि है ......"

परिवर्तनीय "@ डी 2" इस कोड में रेखांकित किया गया है, इसका मतलब है कि यह त्रुटि इस चर के कारण होती है।

क्या आप मेरी सहायता कर सकते हैं कि लोड डेटा @ वैरिएबल इंफाइल में फ़ाइल नाम के चर के सही तरीके से परिभाषित कैसे करें?

धन्यवाद।

उत्तर

1

यह sysntax काम नहीं कर सकता क्योंकि सर्वर द्वारा चर का अर्थ है, और फ़ाइल mysql क्लाइंट द्वारा पढ़ी जाती है। इसलिए ग्राहक @ d2 के लिए एक अवैध फ़ाइल नाम है।

5

MySQL documentation से एक प्रशस्ति पत्र:

फ़ाइल नाम एक शाब्दिक स्ट्रिंग के रूप में दिया जाना चाहिए। विंडोज़ पर, पथ नामों में बैकस्लाश को अगली स्लेश या बैकस्लाश के रूप में दोगुनी करें। Character_set_filesystem सिस्टम चर फ़ाइल नाम की व्याख्या को नियंत्रित करता है।

इसका मतलब है कि यह एक तैयार कथन, संग्रहीत प्रक्रिया, या कुछ भी "सर्वर-साइड" का पैरामीटर नहीं हो सकता है। स्ट्रिंग/पथ मूल्यांकन क्लाइंट साइड किया जाना चाहिए।

1

दुर्भाग्यवश, यह mysql में संभव नहीं प्रतीत होता है।

इसके अलावा Binary Alchemist'sanswer लिए, यह भी संभव नहीं prepaired बयानों के साथ या तो, के रूप में यह इस सूची में नहीं है: SQL Syntax Allowed in Prepared Statements

आप soemthing बाहरी इस्तेमाल कर सकते हैं अपनी लोड डेटा infile बयान उत्पन्न करने के लिए, और फिर एसक्यूएल चलाने । उदाहरण के लिए आप इसे Excel में बना सकते हैं।

3

सामान्यतः, यह सीधे संभव नहीं है लेकिन आप एक अस्थायी फ़ाइल का उपयोग कर सकते हैं।

प्रक्रिया एक संयोजन का उपयोग करने के समान है, EXECUTE। ध्यान दें कि आप लोड डेटा इन्फाइल के साथ तैयार नहीं कर सकते हैं, इस कारण से आपको एक अस्थायी फ़ाइल की आवश्यकता है।

यहाँ कैसे आज की तारीख के साथ एक फ़ाइल को पढ़ने के लिए की एक उदाहरण है:

SET @sys_date = CURRENT_DATE(); 

SET @trg_file = CONCAT("LOAD DATA INFILE '/home/data/file-",@sys_date, "' INTO TABLE new_data FIELDS TERMINATED BY ' ';"); 

SELECT @trg_file INTO OUTFILE '/tmp/tmp_script.sql'; 

SOURCE /tmp/tmp_script.sql; 

चेतावनी: आप फ़ाइलों mysql के साथ, ओवरराइट नहीं कर सकते इस कारण अस्थायी फ़ाइल मौजूद नहीं चाहिए। यदि आप पिछले उदाहरण को स्वचालित करना चाहते हैं तो यह एक गंभीर समस्या है।

+0

आप डेटा INFILE लोड करने के लिए संबंध में फ़ाइल प्रसंस्करण के साथ कुछ करने की ज़रूरत है, मैं भयानक परिणाम जब लिया है मैं इसे एक बैश स्क्रिप्ट के साथ जोड़ता हूं। यहां बताया गया है कि यह कैसे काम करता है: 1) बैश को अपनी दिनांकित डेटा फ़ाइल को "अप्रसन्न" फ़ोल्डर में आयोजित अस्थायी कार्य फ़ाइल में कॉपी करें। फिर एसक्यूएल को कॉल करें जिसमें लोड डेटा इन्फाइल प्रक्रिया है। एसक्यूएल रन के बाद, आप बैश को कार्य फ़ाइल हटा सकते हैं और पर जा सकते हैं लेकिन आप कर सकते हैं –

0

मेरे समाधान पर लिनक्स/मैक/[बैश के साथ विंडोज] (जैसे cygwin) काम करता है

लोड एसक्यूएल, उदा एक टेम्पलेट बनाएं भार।TPL -

LOAD DATA LOCAL INFILE '/path/to/data/%FILENAME%' 
INTO TABLE Avaya_test (Agent_Name, Login_ID, ACD_Time); 

ध्यान दें %FILENAME% प्लेसहोल्डर फिर इस कमांड चलाएँ:

for n in `ls *.txt`; do echo $n; sed -e 's/%FILENAME%/'$n'/g' load.tpl | mysql -u databaseUser databaseName; done