首页 > 学技术 > 技术网文 > PostgreSQL > 正文

[精华] 请看如何在plpgsql函数中返回结果集!


来源 chinaunix.net 酷勤网整理

postgres的record类型只是一个虚拟的东西,它并没有实际的存储空间,因此结果集合的返回一定要依靠一种实在的表的结构,你或者在定义
函数时候返回一个表或者视图或者象下面的例子一样在调用函数的时候
后面跟着一个表的结构。

说明:表和视图创建成功以后在postgres的类型系统表中会自动增加
以他们的名字命名的类型),也就是说某个表和某个视图其实也是一
种数据类型。



create table mm(a int, b int);
insert into mm values(1,1);
insert into mm values(2,2);
insert into mm values(3,3);

create or replace function mmm() returns setof record as
'
declare
   rec record;
begin

   FOR rec IN SELECT * FROM mm LOOP
      RETURN NEXT rec;
   END LOOP;
   
   return NULL;
end;'language 'oplsql';

select a.a,a.b from mmm() a(a int, b int);

 a | b 
---+---
 1 | 1
 2 | 2
 3 | 3



 joint 回复于:2003-03-04 14:23:31

上次我在laser的站点他也给我讲解了,不过用在程序里还是不太方便啊


 shixl 回复于:2003-03-04 14:33:40

利用SQL函数来实现结果集的返回,只是这种方法好像不是十分灵活!!


CREATE FUNCTION mmm() RETURNS SETOF mm AS '
    SELECT * FROM mm;
' LANGUAGE SQL;

SELECT * FROM mmm();


 shixl 回复于:2003-03-04 14:38:30

其实数据库相对于操作系统复杂多了,博大精深。postgres一个开源的软件做到这种程度上已经很不一般了,如果使用它的人多起来,总有一天会和oracle叫板的,这叫应用拉动。到时候我相信会有很多的人都来做postgres的服务,靠买服务赚钱。。。


 joint 回复于:2003-03-04 14:43:56

http://laser.dyndns.zhengmai.net.cn/index.php?t=msg&th=281&start=0&rid=41&S=d941ce7d2d85fa733ee81c8756700042
-----------------
drop table users;
create table users(
user_id integer,
user_name varchar
);
create or replace function sp_user_get(integer) returns varchar as
'
DECLARE
name varchar;
begin
select INTO name user_name from users where user_id = $1;
return name;
end;'
language 'plpgsql';

create or replace function user_rec() returns setof users as '
DECLARE
rec RECORD;
BEGIN
FOR rec IN select * from users LOOP
RETURN NEXT rec;
END LOOP;
RETURN;
END;' language 'plpgsql';

---------------------8<----------------------------

往表里面插些数据,然后:
select * from user_rec();

再简单些的一个例子:

create or replace function set_return_test(int, int) returns setof int as'
DECLARE
i integer;
BEGIN
FOR i IN $1 .. $2 LOOP
RETURN NEXT i;
END LOOP;
RETURN NEXT 10000;
RETURN NEXT 100000;
RETURN;
END;' language 'plpgsql';

执行的结果如下:
laser_uni=# select * from set_return_test(1, 3);
set_return_test
-----------------
1
2
3
10000
100000
(5 rows)


 shixl 回复于:2003-03-04 15:04:03

谈谈你们的应用呗


 joint 回复于:2003-03-04 15:30:02

应用还没有,只是我自己学了一点


 gadfly 回复于:2003-03-04 15:35:44

joint,你那个java程序还有问题么?


 joint 回复于:2003-03-04 15:47:20

第一次运行的时候看到了"上海",然后把数据删除再运行,又成乱码了,我还得再看看,感觉所学还甚浅,感叹!!!!


 gadfly 回复于:2003-03-04 15:52:07

我改了一下,你看看
http://chinaunix.net/forum/viewtopic.php?t=15910


 joint 回复于:2003-03-04 15:54:42

thank you. 多谢关照.再次感谢


 shixl 回复于:2003-03-21 09:15:54

upyixia


 netkiller 回复于:2003-03-30 15:07:30

我现在,用pgsql 做项目。。
目前是
Form ==>; jsp ==>; javaBean ==>; jdbc(pgsql)  ==>; 
如果是select 用view来做。
如果是删除记录并涉及外键。就用触发器去删除外键的表。。
如果是大量查找分析就用select func() 过程来做。然后反回结果集。
如果是一些特定的操作也用过程例:adduser(varchar,varchar),deluser(integer id).......ext
目前还没用到游标。。 

总之用最少的连接做大量的处理。尽量在数中完成操作。能用数据库的不用程序做。。。。。。。

大家有什么看法。。你们是怎么做的。。请多指教。。。。。

目前我的pgsql脚本以达到500行了。包括表,view,触发器,过程。。。ext
维护起来真是有点力不从心:)




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=26841
转载请注明作者名及原文出处



收藏本页到: