【问题标题】:plpgsql: concatenation of variable into FROM clauseplpgsql:将变量连接到 FROM 子句中
【发布时间】:2012-02-11 23:07:33
【问题描述】:

我是 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 的连接管理不当。有什么建议吗?

【问题讨论】:

  • 我们是否可以添加一个'r'标签并以这种方式解决它?
  • 我当然想过……但我需要快速加载 postgresql COPY 命令……我有几十个文件 ~500MB。
  • @dirk,如果我要在 R 中滚动查询字符串,我可以将其作为查询提交吗?我在想我只能用普通的sql而不是plpgsql来做到这一点,所以我什至没有尝试。
  • 我只是很普通,创建循环,并在每次迭代中读取相应的文件,然后将其写入(或附加)到 db。

标签: postgresql plpgsql


【解决方案1】:
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;

【讨论】:

  • 谢谢赛斯。我确信这与解析并以正确的顺序重新组合在一起有关。如果没有帮助,我当然不会解码。
【解决方案2】:

我认为我不会为此使用 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 服务器用户对文件具有读取权限。

【讨论】:

  • 使用 psql \copy 命令我可以用任何语言包装它,实际上。漂亮的方法。谢谢!
猜你喜欢
  • 2020-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-21
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多