PostgreSQL,lo_export 查询到存储过程

Posted

技术标签:

【中文标题】PostgreSQL,lo_export 查询到存储过程【英文标题】:PostgreSQL, lo_export query to stored procedure 【发布时间】:2012-05-18 12:06:36 【问题描述】:

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

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

【问题讨论】:

我无法以某种方式添加psql标签 如果这些图片不是真的很大,那么使用bytea 可能是更好的方法 你能用你的 Delphi PostgreSQL 驱动程序的名称/版本更新你的帖子吗?每个驱动程序都有自己的方式来获取大型对象和二进制数据。 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于PostgreSQL,lo_export 查询到存储过程的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 子查询

PostgreSQL 子查询

PostgreSQL经纬度查询

PostgreSQL——查询重写——定义规则

PostgreSQL——查询重写——定义规则

如何查询postgresql数量?