2015-07-19 62 views
1

我想創建一個包含來自不同表的數據的自定義變量(字符串)。 我不能在一個查詢中執行它(特殊的存儲順序和動態列)。plpgsql,如何將變量存儲到文件中

有沒有辦法將變量存儲到文件中?

或者使用命令行將一個變量的結果保存到文件中?

+0

您的意思是將查詢結果導出並存儲到文件中?請澄清。 – Spidey

+0

Nimesh,編輯。 –

+0

而「命令行」應該是shell?或者psql?那麼plpgsql如何進入呢?請澄清你的問題,顯示你的代碼(即使它不工作),並添加你的Postgres版本(一如既往)。 –

回答

3

由於標籤plpgsql我假設你正在plpgsql函數中執行一些查詢,保存在一個變量中的結果應該發送到一個文件。

在普通的SQL,你可以使用copy命令保存在一個文件中的文本,是這樣的:

copy (select 'some text') to 'c:\data\sample.txt'; 

在PLPGSQL功能,你應該使用execute命令來選擇一個變量,例如值:

create or replace function copy_some_text_to_file(filename text) 
returns void language plpgsql 
as $$ 
declare 
    var text:= 'some text'; 
begin 
    execute format($fmt$ 
     copy (select '%s') to '%s' 
     $fmt$, var, filename); 
end $$; 

select copy_some_text_to_file('c:\data\sample.txt') 

如果你想保存到文件與多行字符串變量,你可以使用regexp_split_to_table()

create or replace function copy_some_text_to_file(filename text) 
returns void language plpgsql 
as $$ 
declare 
    var text:= 'first line\nsecond line\nthird line'; 
begin 
    execute format($fmt$ 
     copy (select regexp_split_to_table(e'%s', e'\n')) to '%s' 
     $fmt$, var, filename); 
end $$; 

請注意,該字符串不能包含單引號,必須正確轉義該引號。在第一個版本中,您可以用%L(如Erwin建議的)替換'%s',但在第二個版本中不能這樣做。

瞭解更多:

+2

它必須是格式('$ fmt $ copy(選擇%L)到%L $ fmt $,var,filename);'以正確地轉義文字。喜歡:http://stackoverflow.com/a/16991854/939860 –

+0

謝謝,有沒有辦法使用腳本斷行?我已經試過E'',\ n –

1

從Linux執行SQL殼您可以輕鬆地將結果重定向到一個文件:

[email protected]:~$ psql mydb --tuples-only -c 'select 1' > /path/to/myfile.txt 

或者EXEC對於文件UTE SQL:

[email protected]:~$ psql mydb -t -f /path/to/myscript.sql > /path/to/myfile.txt 

或者從內部PSQL:

\o /path/to/myfile.txt 
\t 
SELECT 1; 
\o 

一切都在the manual for psql解釋。