2011-06-06 12 views
6

से चर के संगतता मैं पोस्टग्रेस्क्ल के लिए नया हूं और CSV फ़ाइलों की एक श्रृंखला पर लूपिंग के लिए एक फ़ंक्शन बनाने और उन्हें लोड करने के लिए संघर्ष करने के लिए संघर्ष कर रहा हूं। मैं कॉपी एक ही फाइल के साथ ठीक काम कर सकता हूं, लेकिन मैं फॉर लूप वाक्यविन्यास सही नहीं कर पा रहा हूं।plpgsql: खंड

CREATE OR REPLACE FUNCTION test() RETURNS void as $$ 
BEGIN 
    FOR i IN 1982..1983 LOOP 
    COPY myTable 
    FROM '/path/tmp.' || i::VARCHAR || '.out.csv' 
    delimiters ',' 
    END LOOP; 
END; 
$$ LANGUAGE 'plpgsql'; 

इस पर एक त्रुटि फेंकता है: मैं एक साल संख्या के रूप में मेरी मक्खियों /path/tmp.YEAR.out.csv

नाम हैं स्थानापन्न करने यह मैं क्या हैक की गई है कोशिश कर रहा हूँ पहला || तो मुझे संदेह है कि मैं परिवर्तनीय i अनुचित तरीके से संगत प्रबंधन कर रहा हूं। कोई सुझाव?

+0

क्या हमें एक 'आर' टैग जोड़ने और इसे हल करने की अनुमति है? –

+0

मैंने निश्चित रूप से इसके बारे में सोचा था ... लेकिन मुझे postgresql COPY कमांड की तेज़ लोडिंग की आवश्यकता है ... मेरे पास कुछ दर्जन फ़ाइलें ~ 500MB हैं। –

+0

@dirk, अगर मैं आर में क्वेरी स्ट्रिंग रोल करना चाहता था तो क्या मैं इसे एक प्रश्न के रूप में सबमिट कर सकता हूं? मैं सोच रहा था कि मैं केवल सादे वर्ग के साथ ऐसा कर सकता हूं, plpgsql नहीं, इसलिए मैंने कोशिश भी नहीं की। –

उत्तर

6
CREATE OR REPLACE FUNCTION test() RETURNS void as $$ 
BEGIN 
FOR i IN 1982..1983 LOOP 
    EXECUTE 'COPY myTable FROM ''/path/tmp.' || i::text 
              || '.out.csv'' DELIMITERS '',''; '; 
END LOOP; 
END; 
$$ language plpgsql; 
+0

धन्यवाद सेठ। मुझे यकीन था कि इसे चीजों को पार्स करने और सही क्रम में एक साथ वापस रखने के साथ किया जाना था। मैं निश्चित रूप से मदद के बिना इसे डीकोड नहीं किया होता। –

5

मुझे नहीं लगता कि मैं इसके लिए plpgsql का उपयोग करूंगा।

#!/bin/sh 

DBHOST=mydbhost 
DBNAME=mydbname 

files=$1 
target=$2 

for file in ${files}; do 
    psql -h ${DBHOST} ${DBNAME} -c "\copy ${target} FROM '${file}' delimiters ','" 
done 

उपयोग का उदाहरण:

csv2psql "$(ls *.out.csv)" someschema.tablename 

नोट: इस तरह आप भी कॉपी के साथ फ़ाइलों को पढ़ने की समस्या से बचने जो postgres सर्वर उपयोगकर्ता की आवश्यकता को पढ़ लिया है के लिए एक खोल स्क्रिप्ट और अधिक आम तौर पर उपयोगी हो सकता है फ़ाइल पर अनुमतियां।

+1

psql \ copy कमांड का उपयोग करके मैं इसे किसी भी भाषा में वास्तव में लपेट सकता हूं। निफ्टी दृष्टिकोण। धन्यवाद! –