免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 9948 | 回复: 8
打印 上一主题 下一主题

存储过程里的二维数组 [复制链接]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-02-27 00:28 |只看该作者 |倒序浏览
想在POSTGRESQL里用二维数组,怎么也不行,求救!
一个简单的二维数据,怎么也没办法通过:

declare
  ARR  integer [][];

begin
  for i    in 1..10     loop      
       for  j    in 1..3     loop
                 arr[i][j]   := i * j;  
       end    loop;
   end     loop;

   for   i   in 1..10 loop      
       for  j    in 1..3 loop
               raise notice ' %     ',    arr[i][j] ;      
       end     loop;
   end     loop;

end;

论坛徽章:
0
2 [报告]
发表于 2011-02-28 08:51 |只看该作者

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
3 [报告]
发表于 2011-02-28 10:03 |只看该作者
第一种写法是正确的
但postgresql数组要先扩冲,再赋值,因为它的长度不是固定, 否则会出现下标引用错误。

比如:一个空的数组site[][]
你要给它增一列,先扩充site:=site||array[array['','']]
再赋值
site[1][1]='ccc'
site[1][2]='ddd'

或者直接扩充赋值site:=site||array[array['ccc','ddd']]

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
4 [报告]
发表于 2011-02-28 10:04 |只看该作者
回复 2# trainee


    需要注册后才能看到。还好我有帐户,所以给拷贝过来了。像这样的内容建议你以后拷贝过来,然后给上链接。呵呵。

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2011-03-01 23:35 |只看该作者
site:=site||array[array['','']]
-------------------------------------------------

把我的程序改写成这种语法不行呀,

这种语法是出自哪里?好像POSTGRESQL数组文档里没有

ERROR:  operator does not exist: integer[] || text[]
LINE 1: SELECT ARR||array[array['','']]

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
6 [报告]
发表于 2011-03-02 00:46 |只看该作者
在ORACLE 里,有联合数组类型,嵌套表类型,
比如:
TYPE  MYREC  IS TABLE OF  TABLE%ROWTYPE  INDEX BY BINARY_INTEGER;
相当于一个自定义多维复合数组

经过研究,POSTGRESQL,也可以有类似的功能,

比如先自定义一个类型:
create type  tmytype as (
        partno  varchar(16),
        descr     varchar(20),
        onhand_qty  numeric(14,4)
);

然后在存储过程里定义复合数组

mytype   tmytype[];

可以用
mytype[1]   := row('001',   'abc',  100);
mytype[2]   := row('001',   'abc',  100);
...                 ......               ........
赋值,

用下标引用某个字段值,

   vpartno  :=   mytype[1].partno;
   vdescr   :=     mytype[1].descr;
   vonhand_qty  := mytype[1].onhand_qty;


很灵活,完全可以跟ORACLE的联合数组,嵌套表相比,


但类似   INTEGER[][]的多维数组使用,还没搞清楚怎么用。
不知道哪位搞懂了?

论坛徽章:
0
7 [报告]
发表于 2011-03-02 09:33 |只看该作者
declare
  ARR  integer [][];

begin
  for i    in 1..10     loop  
      arr:=arr||array[array[0,0,0]]
       for  j    in 1..3     loop
                 arr[i][j]   := i * j;  
       end    loop;
   end     loop;

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
8 [报告]
发表于 2011-03-02 21:22 |只看该作者
谢谢楼上各位,还真可以,
只是不知道这样看起来很怪异的语法,你们是从哪里得到的?好像在PG文档里没找到哦。

论坛徽章:
0
9 [报告]
发表于 2011-03-03 09:03 |只看该作者
琢磨出来的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP