2012-05-18 108 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仍然會更加高效。