2012-01-11 51 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