PostgreSQL,lo_export查询到存储过程

时间:2012-05-18 12:06:37

标签: postgresql delphi stored-procedures plpgsql psql

我正在使用PostgreSQL 9.0的Delphi 7应用程序。我将一些图像存储在数据库中OID,应用程序远程连接到PostgreSQL。

我正在使用此查询:

"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.12 -p 5432 -d MyDB -U myDB_admin -c  "\lo_export 16848379 'C://leeImage.jpeg'"

并在表单上显示图像。这样可以正常工作,但大约需要1秒钟才能执行并显示图像。

所以我试图将查询转换为这样的存储过程:

CREATE OR REPLACE FUNCTION GET_FISHIMAGE(path TEXT ,Host TEXT,DatabaseName TEXT,userName TEXT,outputpath TEXT) RETURNS text AS $$
BEGIN
  //perform this..!!!
  //"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h 192.168.1.12 -p 5432 -d myDB -U myDB_admin -c  "\lo_export 16848379 'C://leeImage.jpeg'"

END;
$$ LANGUAGE plpgsql;

我在互联网上搜索过但无法确定转换是否可行。 谁能告诉我如何将上述查询转换为存储过程?

1 个答案:

答案 0 :(得分:1)

plpgsql编写的服务器函数启动外部程序是不可能的,即使切换到支持它的语言,如plperlu,也无法解决问题,因为:

  • 它的性能与从客户端计算机上执行时一样差,因为启动psql和建立连接的开销是相同的。

  • \lo_export命令会在数据库服务器上创建文件,而在客户端计算机上需要它。否则,您可以调用lo_export() SQL函数,并且首先只需要启动psql来检索图像。

该问题的简单,架构清晰的解决方案是使用Delphi数据库驱动程序可能公开的BLOB API将二进制数据从服务器传输到客户端。

如果在API中没有任何东西可以获取二进制数据,那么仍然可以将编码二进制大对象的服务器端函数编写为base64的文本编码版本或类似的,并在客户端解码。每次需要检索图片时,启动psql仍然会更有效率。