我正在使用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;
我在互联网上搜索过但无法确定转换是否可行。 谁能告诉我如何将上述查询转换为存储过程?
答案 0 :(得分:1)
从plpgsql
编写的服务器函数启动外部程序是不可能的,即使切换到支持它的语言,如plperlu
,也无法解决问题,因为:
它的性能与从客户端计算机上执行时一样差,因为启动psql和建立连接的开销是相同的。
\lo_export
命令会在数据库服务器上创建文件,而在客户端计算机上需要它。否则,您可以调用lo_export() SQL函数,并且首先只需要启动psql
来检索图像。
该问题的简单,架构清晰的解决方案是使用Delphi数据库驱动程序可能公开的BLOB API将二进制数据从服务器传输到客户端。
如果在API中没有任何东西可以获取二进制数据,那么仍然可以将编码二进制大对象的服务器端函数编写为base64
的文本编码版本或类似的,并在客户端解码。每次需要检索图片时,启动psql仍然会更有效率。