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

4

我有一个 .sql 文件,其中一些行看起来像这样:

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

然而,这会隐藏example-message.msg文件的内容,使我的文件(实际上是测试用例列表)不如我所愿易读。理想情况下,我希望能够内联example-message.msg的内容。但它是一个大型的多行文件。
我已经尝试使用here-docs:
\set buf `cat <<EOF | base64 -w0
plan { }
EOF
`

然而,这里psql抱怨一个未终止的引用字符串,并且回顾文档说它无论如何都行不通。(但无论如何,元命令的参数不能超过行的末尾。
接下来,我考虑了一些方法来构建要执行的字符串:
SELECT $$
plan: {}
$$ AS rawbuf \gset
\set buf `echo :rawbuf | base64 -w0`

这也不起作用,原因很明显。但我似乎无法让任何变化的东西起作用。我想在反引号中使用 psql 不进行变量替换
还有其他我没有注意到的方法吗?
1个回答

3

实际上不支持多行元命令。在您的情况下,似乎是往返于 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')
);

谢谢你的回答!虽然你解决了我的问题,但我实际运行的命令比base64要长得多。我认为你是对的,这是唯一的答案,最终我编写了一个C函数,它可以外壳并让我嵌入像你建议的$$分隔字符串。 - num1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接