0

我正在开发一个使用 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;

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

4

1 回答 1

1

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

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

  • \lo_export命令将在数据库服务器上创建文件,而您在客户端计算机上需要它。否则,您可以调用lo_export() SQL 函数,并且psql一开始就不需要为了检索图像而启动。

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

万一 API 中根本没有任何东西来获取二进制数据,仍然可以将服务器端函数将二进制大对象编码为具有base64或类似的文本编码版本,然后在客户端对其进行解码-边。这仍然比每次需要检索图片时启动 psql 更有效。

于 2012-05-18T17:32:42.863 回答