有类似的问题,但他们没有解决我的问题: 我有一个在我的远程数据库中定义的存储过程。作为其操作的一部分,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,这不是最好的主意。
你能帮我找到解决方案吗?谢谢
感谢
答案 0 :(得分:2)
你是using the wrong path。这是常见的错误来源。从服务器的角度来看,这都是关于"
带文件名的COPY指示PostgreSQL服务器直接读取 来自或写入文件。 PostgreSQL必须可以访问该文件 user(服务器运行的用户标识)和名称必须指定 从服务器的角度来看。指定PROGRAM时, server执行给定的命令并从标准输出中读取 的程序,或写入程序的标准输入。该 必须从服务器的角度指定命令,并且 可由PostgreSQL用户执行。指定STDIN或STDOUT时 数据通过客户端和客户端之间的连接传输 服务器
如果您没有可用路径,则需要
psql
连接到远程服务器并读取本地文件。