plpgsql:将变量串联到 FROM 子句中

发布于 2024-11-14 13:30:43 字数 462 浏览 2 评论 0原文

我是 Postgresql 新手,正在努力构建一个函数来循环一系列 CSV 文件并加载它们。我可以使 COPY 在单个文件中正常工作,但我无法使 FOR LOOP 语法正确。我正在尝试替换年份数字,因为我的苍蝇被命名为 /path/tmp.YEAR.out.csv

这就是我所破解的:

CREATE OR REPLACE FUNCTION test() RETURNS void as $$
BEGIN
  FOR i IN 1982..1983 LOOP
    COPY myTable 
    FROM '/path/tmp.' || i::VARCHAR || '.out.csv'
    delimiters ','
  END LOOP;
END;
$$ LANGUAGE 'plpgsql';

这会在第一个 || 处引发错误。所以我怀疑我对变量 i 的连接管理不正确。有什么建议吗?

I'm new to Postgresql and struggling to build a function for looping over a series of CSV files and loading them. I can make the COPY work just fine with a single file, but I'm unable to get the FOR LOOP syntax correct. I'm trying to substitute a year number as my flies are named /path/tmp.YEAR.out.csv

This is what I've hacked up:

CREATE OR REPLACE FUNCTION test() RETURNS void as $
BEGIN
  FOR i IN 1982..1983 LOOP
    COPY myTable 
    FROM '/path/tmp.' || i::VARCHAR || '.out.csv'
    delimiters ','
  END LOOP;
END;
$ LANGUAGE 'plpgsql';

This throws an error at the first ||. So I suspect I'm managing the concat of the variable i improperly. Any tips?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

各自安好 2024-11-21 13:30:43
CREATE OR REPLACE FUNCTION test() RETURNS void as $
BEGIN
FOR i IN 1982..1983 LOOP
  EXECUTE 'COPY myTable FROM ''/path/tmp.' || i::text
                                           || '.out.csv'' DELIMITERS '',''; ';
END LOOP;
END;
$ language plpgsql;
CREATE OR REPLACE FUNCTION test() RETURNS void as $
BEGIN
FOR i IN 1982..1983 LOOP
  EXECUTE 'COPY myTable FROM ''/path/tmp.' || i::text
                                           || '.out.csv'' DELIMITERS '',''; ';
END LOOP;
END;
$ language plpgsql;
忘你却要生生世世 2024-11-21 13:30:43

我认为我不会为此使用 plpgsql。 shell 脚本可能更普遍有用:

#!/bin/sh

DBHOST=mydbhost
DBNAME=mydbname

files=$1
target=$2

for file in ${files}; do
    psql -h ${DBHOST} ${DBNAME} -c "\copy ${target} FROM '${file}' delimiters ','"
done

示例用法:

csv2psql "$(ls *.out.csv)" someschema.tablename

注意:这样您还可以避免使用 COPY 读取文件的问题,这需要 postgres 服务器用户对文件具有读取权限。

I don't think I'd use plpgsql for that. A shell script could be much more generally useful:

#!/bin/sh

DBHOST=mydbhost
DBNAME=mydbname

files=$1
target=$2

for file in ${files}; do
    psql -h ${DBHOST} ${DBNAME} -c "\copy ${target} FROM '${file}' delimiters ','"
done

example usage:

csv2psql "$(ls *.out.csv)" someschema.tablename

Note: This way you also sidestep the problem of reading files with COPY which requires the postgres server user to have read permissions on the file.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文