六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 158|回复: 0

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

[复制链接]

升级  20%

2

主题

2

主题

2

主题

童生

Rank: 1

积分
10
 楼主| 发表于 2013-1-30 01:24:32 | 显示全部楼层 |阅读模式
 

 

为什么要把游标数据存到数组

如果一个游标频繁调用,那么就会频繁访问数据库,导致效率慢。

如果把调用一次游标后,把数据存到数组,效率会高。

 

postgresql与oracle  转换成array的区别

 

关于postgresql的文章比较难找到,通常都是先找到oracle再猜测postgresql代码怎么写

oracle的实现,可以参考 :


http://dolphin-ygj.iteye.com/blog/440204

PG“基本类型”数组变量定义语法:

array_name  integer[];
 
或者

array_name  integer ARRAY[4];
 

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

array_name  表%rowtype[];array_name  游标%rowtype[];
 

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

再回到PG的文档仔细阅读发现: 
数组类型可以是任何基本类型或用户定义类型。不支持复合类型和域的数组

 


唯一能想到只能是先自定义数据类型了:

 

 

第一步:

 

create type array_type  AS (  border_type_cd  varchar(20),  max_value    numeric(9,3),  min_value    numeric(9,3),  ref_code    varchar(20));
 

 

第二步:定义变量

 

declare               ref_datas array_type[];               row_num int;              cursor_name  cursor is select * from table;
 

 第三步:循环游标数据cursor_name,放到数组ref_datas

 

row_num=0;for rd in cursor_name loop--raise notice '%',row_num;ref_datas[row_num]=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)联系本人
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表