2012-05-18 76 views
0

我正在使用PostgreSQL 9.0的Delphi 7应用程序。我有一些图像作为OID存储在数据库中,并且应用程序远程连接到PostgreSQL。PostgreSQL,存储过程的lo_export查询

我使用这个查询:

"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

如果这些照片是不是我不能添加'psql'标签莫名其妙 – PresleyDias

+0

* *真大,那么使用'bytea'可能是一个更好的办法 –

+0

你可以更新你的Delphi的PostgreSQL驱动程序名称/版本的帖子?每个驱动程序都有自己的方式来获取大对象和二进制数据。 –

回答

1

从写在plpgsql服务器功能启动的外部程序是不可能的,即使切换到支持它,就像plperlu一种语言,那将不能解决问题,因为:

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

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

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

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