Postgresql 如何在psql文件中嵌入多行shell命令

Postgresql 如何在psql文件中嵌入多行shell命令,postgresql,psql,Postgresql,Psql,我有一个.sql文件,其中有些行如下所示: \set buf `cat example-message.msg | base4 -w0` SELECT * FROM run_select(:'buf'); 但是,这会隐藏example message.msg的内容,并使我的文件(实际上是一个测试用例列表)的可读性降低。理想情况下,我可以在线查看example message.msg的内容。但它是一个大的多行文件 我已尝试使用以下文档: \set buf `cat <<EOF | b

我有一个.sql文件,其中有些行如下所示:

\set buf `cat example-message.msg | base4 -w0`
SELECT * FROM run_select(:'buf');
但是,这会隐藏
example message.msg
的内容,并使我的文件(实际上是一个测试用例列表)的可读性降低。理想情况下,我可以在线查看
example message.msg
的内容。但它是一个大的多行文件

我已尝试使用以下文档:

\set buf `cat <<EOF | base64 -w0
plan { }
EOF
`
出于显而易见的原因,这也不起作用。但我似乎也无法让它的任何变化发挥作用。我认为psql在backticks中


我还缺少其他方法吗?

实际上不支持多行元命令。在您的例子中,似乎是到
base64-w0
的往返调用了meta命令。但是,通过在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')
);

谢谢你的回答!虽然您已经解决了提出的问题,但我运行的实际命令的管道比base64长。我想你是对的,这是唯一的答案,不过,我最终编写了一个C函数,它可以按你的建议嵌入$$删除的字符串。
SELECT * FROM run_select(encode(convert_to($delim$
  --multi-line string
$delim$
  , 'UTF-8'), 'base64')
);