我正在尝试使用来自程序命令的 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)
笔记: