0

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');

両方のコードが 1 つのファイルに含まれています。クライアントサイトのlo_importが必要なため、ステートメントを挿入するためにlo_import()を配置できません。変数 LASTOID がありますが、add_file 関数では使用できません。また、add_file() を呼び出すたびに更新されるわけではありません。
では、どのようにデータベースに oid を配置できますか?この例では、'flag' と 'sth' を挿入ステートメントと引数付きの関数内のすべてで使用できますか? ファイルはクライアント コンピューターにあります。

4

1 に答える 1

1

psql\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(おそらくアドホック呼び出しを除く)。


plpgsql 関数内から、提供されているサーバー側関数も使用できます。次のようになります。

INSERT INTO tab_one(file_oid, sth) VALUES (lo_import('/etc/motd'), _sth);

これは、データベースサーバーのファイル システム内で、所有者 (通常は system user ) の権限で動作することに注意してくださいpostgres。したがって、使用はスーパーユーザーに限定されます。

于 2012-08-24T06:14:58.437 に答える