我将文档导入postgres db时遇到问题。我有plpgsql函数,简化版本可能看起来像这样:
create function add_file(flag integer, sth varchar) returns void as
begin
if flag = 1 then
insert into tab_one values (my_file_oid, sth);
else
insert into tab_two values (my_file_oid, sth);
end if;
end;
和psql命令:
\lo_import('path/to/file');
两个代码都在一个文件中。我不能把lo_import()插入语句,因为我需要客户端站点lo_import。有变量LASTOID,但在add_file函数中无法使用。并且它不会在每次调用add_file()时更新。
那么,我怎么能把oid放到数据库中,在我们的例子中,插入语句的'flag'和'sth'以及带参数的函数中的所有内容?文件在客户端计算机中。
答案 0 :(得分:1)
psql's \lo_import
返回导入产生的OID。你需要把它作为参数传递给函数,它可能如下所示:
CREATE FUNCTION add_file(_flag integer, _sth varchar, _oid oid)
RETURNS void LANGUAGE plpgsql AS
BEGIN
IF _flag = 1 THEN
INSERT INTO tab_one(file_oid, sth) VALUES (_oid, _sth);
ELSE
INSERT INTO tab_two(file_oid, sth) VALUES (_oid, _sth);
END IF;
END;
顺便说一句:总是使用INSERT
命令向您的表添加列列表(可能是ad-hoc调用除外)。
在plpgsql函数中,您可以使用同样提供的server side functions。可能看起来像这样:
INSERT INTO tab_one(file_oid, sth) VALUES (lo_import('/etc/motd'), _sth);
请注意,这在具有所有者(通常是系统用户postgres
)的特权的数据库服务器的文件系统中运行。因此,使用仅限于超级用户。