2012-01-11 114 views
0

我的應用程序接收到JPG圖像作爲字節數組從連接到系統的裝置。這些需要寫入PostgreSql 9.1數據庫的大對象表。我目前正在使用C#和Devgre docConnect for PostgreSql庫來訪問我的數據庫,並且一切工作正常。問題是將數據寫入數據庫(我需要更新2個表格,並將圖像字節寫入大對象表格)需要多次訪問數據庫。我想減少我的代碼對數據庫的訪問次數,以加快速度。PostgreSQL大對象和存儲函數

我已經寫了存儲功能,其對兩個表的UPSERT。我想將圖像字節作爲字節數組參數傳遞給存儲函數,並使存儲函數將圖像字節寫入大對象表。這可能嗎? PostgreSQL的9.1手動服務器端功能的文檔是輕薄的,我不知道用什麼函數調用來讀取&寫入數據。

感謝

託尼

+0

會不會使用' bytea'而不是讓事情變得更容易? – 2012-01-11 21:52:38

+0

請參閱我對第十二題的回答的評論。 – 2012-01-12 00:40:02

+0

我還是不明白。如果你已經*有* bytea,那麼爲什麼還需要LargeObject呢? – 2012-01-12 08:02:03

回答

1

與Oracle或微軟,Postgres沒有的功能和存儲過程區別......它只有功能(在Postgres的手動功能,左右仰望......非常靈活好吧,你可以調用c或java庫和其他有趣的東西)。所以,你將創建(可能在PLPGSQL)函數接受幾個參數,然後調用使用SELECT語句作爲函數(arguement1,ARG2,等等)的功能。這裏是如果你想要一個模板的例子:

在它的語言和語法
CREATE OR REPLACE FUNCTION deleteme 
(deleteid integer) 
RETURNS integer AS 
$BODY$ 
BEGIN 
delete from mytable_attrib where id = $1; 
delete from mytable where id = $1; 
return 0; 
END; 
$BODY$ 
LANGUAGE plpgsql VOLATILE; 

有點不同,那麼你可能被用來...不名的變量相同的名稱,例如列名...或者準備轉移到動態SQL以使用plpgsql在變量中構建語句並將該變量作爲sql執行。

執行它像一個函數,而不是EXEC語法Oracle或MS想。要刪除ID行8我現在可以使用

select deleteme(8) 

加分蘋果拼寫檢查的Postgres改變後的油脂

我應該舉報,我的知識是不是8.4 9.1

+0

我知道這一點。我的道歉不是特定的,但我的問題與Postgres中內置的大對象函數(以「lo_」開頭的函數)有關。我想傳遞一個bytea參數給函數;我不知道調用什麼「lo_」函數來將bytea寫入大對象表,因爲我知道的函數將文件名作爲參數。我不想將數據寫入文件系統,只是爲了將其放入大對象表中。 – 2012-01-12 00:38:39

+0

哦,對不起......我在這裏有點偏離你的意圖。實際上,我避免在我創建的任何數據庫中使用大對象,所以我在這裏沒有任何直接的經驗給你......對不起。我假設你已經安裝了contrib文件。 http://www.postgresql.org/docs/9.1/static/lo-interfaces.html#LO-WRITE是我可以告訴你一個最好的 – Twelfth 2012-01-12 20:01:54