我可能在这里扭曲了 postgres,但从根本上说,我想做的是获取一个字符串变量并将其传递给仅使用 psql 的 sql 命令(在本例中为 COPY)。
所以这就是我想出的。这些命令被分成 2 个文件,因为我希望能够在其他情况下使用 mydb_functions:
文件一:mydb_functions--1.0.sql (在共享/扩展和 mydb_functions.control 中也按照手册中的描述进行设置。给定文件名,返回完整的文件路径。这样做只是为了在下面的 add_data.sql 中制作 COPY 语句,更整洁。
CREATE OR REPLACE FUNCTION fpn(filename text) RETURNS TEXT as '
DECLARE
mypath text := ''/path/to/my/directory/'';
BEGIN
RETURN mypath || filename;
END
' LANGUAGE plpgsql;
文件二: add_data.sql 。这仅用于在命令行使用 psql 将数据复制到现有的 postgres 表中。注意:由于 CREATE EXTENSION 命令,需要以超级用户权限运行 psql。
CREATE EXTENSION IF NOT EXISTS mydb_functions;
-- haven't figured out how to create a function without arguments yet.
CREATE OR REPLACE FUNCTION test (dummyvar text) RETURNS text as '
DECLARE
filepath RECORD;
BEGIN
SELECT * INTO filepath from fpn(''mydatafile.data'');
COPY tablename (columnname) FROM filepath;
END
' LANGUAGE plpgsql;
我坚持的部分是如何从文件路径记录中提取文本以在 COPY 命令中使用。也欢迎任何有关实现此目标的更简单方法的提示。我认为创建一个表来存储变量比这容易得多。但我想完成最后一步。