1

有类似的问题,但它们没有解决我的问题:我在远程数据库中定义了一个存储过程。作为操作的一部分,SP 必须从本地文件批量插入(通过我在本地机器上运行的应用程序):过程:

CREATE OR REPLACE FUNCTION upsert_realtime(path text, traveltime_table regclass)
  RETURNS void AS
$BODY$
BEGIN   
    EXECUTE format('COPY temp_table(link_id,start_time,end_time,travel_time,interval_time, travel_mode) FROM %L DELIMITER '';'' CSV', path);
    --...     
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION upsert_realtime(text, regclass)
  OWNER TO postgres;

提供给 SP 的路径在本地机器上:

select * from upsert_realtime('/home/.../travel_time.txt','realtime_travel_time');

因此我得到这个错误:

terminate called after throwing an instance of 'soci::postgresql_soci_error'
  what():  Cannot execute query. ERROR:  could not open file "/home/.../travel_time.txt" for reading: No such file or directory

我唯一想到的就是以某种方式自动scp将文件发送到 postgresql 服务器,然后运行 ​​SP,这不是最好的主意。你能帮我找到解决办法吗?谢谢,谢谢

4

1 回答 1

2

使用了错误的路径。这是错误的常见来源。这都是关于“从服务器的角度来看”。

带有文件名的 COPY 指示 PostgreSQL 服务器直接读取或写入文件。该文件必须可由 PostgreSQL 用户(服务器运行的用户 ID)访问,并且必须从服务器的角度指定名称。当指定 PROGRAM 时,服务器执行给定的命令并从程序的标准输出读取,或写入程序的标准输入。该命令必须从服务器的角度指定,并且可由 PostgreSQL 用户执行。当指定 STDIN 或 STDOUT 时,数据通过客户端和服务器之间的连接传输。

如果您没有可用的路径,则需要

  • 将文件移动到服务器,并使用正确的路径,
  • 在服务器上调用可以访问本地文件的程序,
  • 用于psql连接远程服务器并读取本地文件。
于 2015-01-28T04:04:40.050 回答