如何将动态命令与程序复制一起使用?

hac*_*oar 1 postgresql copy

我正在尝试使用来自程序命令的 Postgres 副本读取 JSON API。

当我打电话

copy _temp from program 'curl -uri "https://url"';
Run Code Online (Sandbox Code Playgroud)

它工作正常,但 API 有分页,我需要循环多次调用。

当我这样称呼它时:

_command := 'curl -uri "https://url?&page='||(10::text)||"';
copy _temp from program _command;`
Run Code Online (Sandbox Code Playgroud)

我得到

ERROR:  syntax error at or near "_command"
Run Code Online (Sandbox Code Playgroud)

你甚至不能像

copy _temp from program 'curl -uri "https://url?&page='||(10::text)||'"';
Run Code Online (Sandbox Code Playgroud)

提高通知样式中的百分比参数替换也不起作用。

是什么赋予了?程序是带单引号的文字字符串,那么指定文字字符串和使用 text 或 varchar 变量有什么区别?似乎没有任何程序数据类型(::program cast 什么也不做),我错过了什么?

在文档中它说'最好使用固定的命令字符串'而不是你只能使用固定的命令字符串......

如何使用动态命令字符串?

dez*_*zso 11

如果要使用动态命令,则需要正确的上下文。简单的 SQL 不是其中之一。

一种可能性是使用 PL/pgSQL,它的EXECUTE功能。用于DO进入上下文:

DO $$
DECLARE page integer;
BEGIN
FOR page IN SELECT i FROM generate_series(1, 10) AS t(i)
LOOP
    EXECUTE format($cmd$ COPY _temp 
                         FROM PROGRAM 'curl -uri "https://url?&page=%s"'$cmd$,
                   page::text);
END LOOP;
END; $$;
Run Code Online (Sandbox Code Playgroud)

另一种方法是在 shell 端运行循环。以下示例使用bash

for i in $(seq 1 10); do
    psql -c "COPY _temp FROM PROGRAM 'curl -uri https://url?&page=${i}'"
done
Run Code Online (Sandbox Code Playgroud)

笔记:

  • 我使用两个级别的美元引用($$$cmd$) 来防止引用乘法。
  • 我也在使用format()而不是凌乱的串联。
  • 如果你真的必须引用curl命令的 URI ,你将不得不在那里转义引号。