凡丁丢丢 发表于 2013-1-30 01:24:32

解决postgresql和oracle如何把游标cursor数据存到数组array

 
 
为什么要把游标数据存到数组
如果一个游标频繁调用,那么就会频繁访问数据库,导致效率慢。
如果把调用一次游标后,把数据存到数组,效率会高。
 
postgresql与oracle  转换成array的区别
 
关于postgresql的文章比较难找到,通常都是先找到oracle再猜测postgresql代码怎么写

oracle的实现,可以参考http://www.agoit.com/images/smiles/icon_idea.gif :
http://kongbei888.blog.163.com/blog/static/243266132010218104021496
http://dolphin-ygj.iteye.com/blog/440204

PG“基本类型”数组变量定义语法:
array_nameinteger[]; 
或者
array_nameinteger ARRAY; 

当您看完这文章是否猜测,在PG应该如下定义数组才能存放游标的每条记录
array_name表%rowtype[];array_name游标%rowtype[]; 

可是调试后,你会发现以上代码编译都不能通过。。。

再回到PG的文档仔细阅读发现: 
数组类型可以是任何基本类型或用户定义类型。不支持复合类型和域的数组。 http://www.agoit.com/images/smiles/icon_sad.gif
 

唯一能想到只能是先自定义数据类型了:
 
 
第一步:
 
create type array_typeAS (border_type_cdvarchar(20),max_value    numeric(9,3),min_value    numeric(9,3),ref_code    varchar(20)); 
 
第二步:定义变量
 
declare               ref_datas array_type[];               row_num int;            cursor_namecursor is select * from table; 
 第三步:循环游标数据cursor_name,放到数组ref_datas
 
row_num=0;for rd in cursor_name loop--raise notice '%',row_num;ref_datas=row(rd.border_type_cd, rd.max_value, rd.min_value, rd.ref_code);row_num=row_num+1;end loop; 
 第四步:从数组里拿数据
for i in 0..array_length(ref_datas,1)-1 loopraise notice 'border_type_cd(%)---------max_value(%)----------min_value(%)-------',ref_datas.border_type_cd,ref_datas.max_value,ref_datas.min_value;end loop; 
如有不明,请回帖或qq(625514418)联系本人
页: [1]
查看完整版本: 解决postgresql和oracle如何把游标cursor数据存到数组array