2014-05-07 82 views
0

我正在將一些客戶端的東西遷移到服務器中,並且希望將其放入函數中。Postgres PL/pgSQL函數結果到文件,文件名爲參數

我需要將查詢結果轉換爲CSV文件。但是,我想將結果文件的文件名/位置作爲函數的參數傳遞。

所以,這是什麼,我想做一個簡單的例子:

CREATE FUNCTION send_email_results(filename1 varchar) RETURNS void AS $$ 
DECLARE 
BEGIN 
    COPY(SELECT * FROM mytable) TO filename1 WITH CSV; 
END; 
$$ LANGUAGE plpgsql; 

Postgres的抱怨這個,雖然,因爲它是翻譯的文件名1參數「$ 1」,它不知道該怎麼辦。

如果需要,我可以對路徑進行硬編碼,但能夠將其作爲參數傳遞,肯定會得心應手。

任何人都有任何線索?

+0

公平起見,我想在一個函數中做這件事的原因是我需要導出到函數內的多個文件。所以想象需要傳遞2或3個不同的文件名作爲參數,並在該函數內導出幾個不同的查詢。如果我不需要導出多個查詢,那麼我可以簡單地輸出輸出。 – jasonmclose

+0

在你的函數中使用EXECUTE'你的查詢'。 –

+0

[動態文件名複製]的可能重複(http://stackoverflow.com/questions/16019508/copy-with-dynamic-file-name) –

回答

2

我剛跑過去。事實證明,當使用copy命令時,不能使用參數化參數(至少python作爲存儲過程語言就是這種情況)。所以,你必須不帶參數構建命令,如:

CREATE FUNCTION send_email_results(filename1 varchar) RETURNS void AS $$ 
DECLARE 
BEGIN 
    execute 'copy (select * frommytable) to ' || filename1 || ' with csv;'; 
END; 
$$ LANGUAGE plpgsql; 

您可能需要使用引用功能,使其更易讀一點。我不知道,我不使用plpgsql作爲postgres函數語言,所以語法可能是錯誤的。

execute 'copy (select * frommytable) to ' || quote_literal(filename1) || ' with csv;' 
+0

就是這樣。很棒。最後一點需要注意的是,我仍然必須在文件名周圍加上單引號,所以最終看起來像是'TO'''||。 filename1 || '''WITH CSV;';'。 – jasonmclose

+0

@jasonmclose:如果使用簡單字符串連接,這對SQL注入非常敏感。而是使用'quote_literal()'或''format()''''%L']的第二種形式](http://stackoverflow.com/questions/16019508/copy-with-dynamic-file-name/16021835#16021835 )。 –