PL / pgSQL函数+客户端lo_import

时间:2012-08-24 05:40:25

标签: sql postgresql plpgsql psql

我将文档导入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'以及带参数的函数中的所有内容?文件在客户端计算机中。

1 个答案:

答案 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)的特权的数据库服务器的文件系统中运行。因此,使用仅限于超级用户。