2017-02-17 45 views
3

我有一些線條看起來像這樣的.sql文件:如何PSQL文件中嵌入多行的shell命令

\set buf `cat example-message.msg | base4 -w0` 
SELECT * FROM run_select(:'buf'); 

然而,這隱藏了example-message.msg內容,使我的文件(這是實際上是一個測試用例列表)比我想要的更不可讀。理想情況下,我可以在線內容example-message.msg。但它是一個大型的多行文件。

我在這裏使用-docs的嘗試:

\set buf `cat <<EOF | base64 -w0 
plan { } 
EOF 
` 

然而,這裏的psql抱怨一個未終止引用的字符串,並在事後the docs說,這無論如何都不會工作。 (But in any case, the arguments of a meta-command cannot continue beyond the end of the line.

接下來我考慮以某種方式建立其上執行字符串:

SELECT $$ 
plan: {} 
$$ AS rawbuf \gset 
\set buf `echo :rawbuf | base64 -w0` 

這也不管用,原因是顯而易見的。但我似乎無法得到任何變化的工作。我想在反引號內psql doesn't do variable substitution

有沒有其他的方法我錯過了?

回答

2

確實不支持多行元命令。就你而言,它似乎是要求一個元命令的往返base64 -w0。但它看起來像你能避免在SQL做base64編碼:

SELECT encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
, 'UTF-8'), 'base64') AS buf \gset 

SELECT * FROM run_select(:'buf'); 

臨時:buf也可以,如果它不具有任何其他用途不是被重新注入迴避:

SELECT * FROM run_select(encode(convert_to($delim$ 
    --multi-line string 
$delim$ 
    , 'UTF-8'), 'base64') 
); 
+0

謝謝爲了答案!雖然你已經解決了這個問題,但我正在運行的實際命令的流水線比base64更長。我認爲你是對的,儘管這是唯一的答案,但我最終編寫了一個C函數,它可以讓我嵌入$$字符串,正如你所建議的那樣。 – num1