2015-08-24 65 views
0

我想創建這一說法成一個函數:我可以將 copy命令用於postgresql的函數嗎?

\copy aux("nombre") TO '/home/david/lugares.csv' delimiters ';'; 

所以我做了下:

CREATE OR REPLACE FUNCTION crearcsv() 
     RETURNS void AS 
    $BODY$ 
    DECLARE STATEMENT TEXT; 
    BEGIN 
     RAISE NOTICE 'CREAR CSV'; 
     STATEMENT:= '\copy aux ("nombre") TO ''/home/david/lugares.csv'' delimiters '';'';';  
     RAISE NOTICE '%',STATEMENT; 
     EXECUTE STATEMENT; 
    END;$BODY$ 
     LANGUAGE plpgsql VOLATILE 
     COST 100; 

但我得到的未來時,我打電話給該函數:

NOTICE: \copy aux ("nombre") TO '/home/david/lugares.csv' delimiters ';'; ERROR: syntax error at or near "\"
LINE 1: \copy aux ("nombre") TO '/home/david/lugares.csv' delimiters... ^
QUERY: \copy aux ("nombre") TO '/home/david/lugares.csv' delimiters ';';
CONTEXT: PL/pgSQL function crearcsv() line 7 at EXECUTE statement**

此聲明在PSQL控制檯中工作正常

任何幫助?

+0

這是因爲'\ copy'是一個[psql命令](http://www.postgresql.org/docs/9.3/static/app-psql.html),它或多或少地執行了[sql command copy ](http://www.postgresql.org/docs/9.3/static/sql-copy.html) - 最重要的區別是'\ copy'使用運行psql的計算機的文件系統上的文件,而'copy'使用服務器文件系統上的文件。因此,它們高度相似但不完全相同,並且您不能在函數中使用\ copy,因爲它不是sql命令。 – fvu

+1

'\ copy'是一個'psql'命令,只能**從'psql'中執行。它不是**一般的SQL語句。 –

+0

那麼,我該怎麼做這個功能呢? – user3733164

回答

1

您可以簡單地更改\copycopyCOPY是「SQL變種」的\copy,在數據庫功能的工作原理,語法是相同的,但有一些差異,可以對您相關:

​​

https://wiki.postgresql.org/wiki/COPY

的主要區別在於COPY將輸出文件寫入postgres服務器運行的文件系統中,而不是在執行COPY的服務器上。如果你有一個在本地主機上運行的postgres服務器,這將是相同的,但是對於更復雜的場景可能是個大問題。

又見文檔:http://www.postgresql.org/docs/9.3/static/sql-copy.html

和這樣的回答:Save PL/pgSQL output from PostgreSQL to a CSV file

+0

這樣做的缺點是'copy'只能由Postgres中的超級用戶使用,因爲它將在服務器上寫入文件。 –

+0

以及a_horse_with_no_name說,我不能使用複製,因爲它需要由超級用戶使用。對不起,因爲我沒有提到它 – user3733164

+0

文件系統IO操作通常是不舒服的通過數據庫功能(但不是不可能的:在取決於你的情況)。您可以嘗試使用plpython或plperl,但是您可能會遇到與plpgsql類似的問題。嘗試使用執行psql的shell腳本。 –

0

您可能會更好編寫連接到數據庫並運行COPY命令的Python腳本。 Psycopg2是這個最好的適配器。

相關問題