中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 数据库开发 > PostgreSQL
请看如何在plpgsql函数中返回结果集!
作者:未知 时间:2005-09-13 18:57 出处:ChinaUnix.net 责编:chinaitpower
              摘要:请看如何在plpgsql函数中返回结果集!

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
维护起来真是有点力不从心:)

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有