Postgresql数组与Oracle嵌套表的使用区别

news/2024/7/9 22:23:04 标签: postgresql, oracle, 数据库, 嵌套表, 多维

oracle_0">oracle中的多维数组

Oracle中常说的数组就是嵌套表,下面给出两个多维使用实例,引出和PG的差异:

一维赋值(第一行给1列)

set serveroutput on;
declare
  type arr_num is table of number;
  type arr_arr_num is table of arr_num;
  arr arr_num:= arr_num();
  arrarr arr_arr_num:= arr_arr_num();
begin
    DBMS_OUTPUT.PUT_LINE('====================');
    DBMS_OUTPUT.PUT_LINE(arr.COUNT);
    DBMS_OUTPUT.PUT_LINE(arrarr.COUNT);
    arr.extend;
    arrarr.extend;
    DBMS_OUTPUT.PUT_LINE(arr.COUNT);
    DBMS_OUTPUT.PUT_LINE(arrarr.COUNT);
    arrarr(1) := arr;
    arrarr(1)(1) := 1;
    DBMS_OUTPUT.PUT_LINE('====================');
    FOR i IN 1..arrarr.COUNT 
    LOOP
      DBMS_OUTPUT.PUT('line ' || i || ':');
      for j in 1..arrarr(i).count
      loop
        DBMS_OUTPUT.PUT('|' || arrarr(i)(j) || '|');
      end loop;
      DBMS_OUTPUT.PUT_LINE('');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('====================');
end;
/

结果

====================
0
0
1
1
====================
line 1:|1|
====================

二维赋值(第二行给3列)


set serveroutput on;
declare
  type arr_num is table of number;
  type arr_arr_num is table of arr_num;
  arr arr_num:= arr_num();
  arrarr arr_arr_num:= arr_arr_num();
begin
    DBMS_OUTPUT.PUT_LINE('====================');
    DBMS_OUTPUT.PUT_LINE(arr.COUNT);
    DBMS_OUTPUT.PUT_LINE(arrarr.COUNT);
    arr.extend;
    arrarr.extend;
    DBMS_OUTPUT.PUT_LINE(arr.COUNT);
    DBMS_OUTPUT.PUT_LINE(arrarr.COUNT);
    arrarr(1) := arr;
    arrarr(1)(1) := 1;
    DBMS_OUTPUT.PUT_LINE('====================');
    FOR i IN 1..arrarr.COUNT 
    LOOP
      DBMS_OUTPUT.PUT('line ' || i || ':');
      for j in 1..arrarr(i).count
      loop
        DBMS_OUTPUT.PUT('|' || arrarr(i)(j) || '|');
      end loop;
      DBMS_OUTPUT.PUT_LINE('');
    END LOOP;
    DBMS_OUTPUT.PUT_LINE('====================');
    arr.extend;
    arr.extend;
    arrarr.extend;
    arrarr(2) := arr;
    arrarr(2)(1) := 11;
    arrarr(2)(2) := 21;
    arrarr(2)(3) := 31;

    DBMS_OUTPUT.PUT_LINE('line 1 count: ' || arrarr(1).count);
    DBMS_OUTPUT.PUT_LINE('line 2 count: ' || arrarr(2).count);
    DBMS_OUTPUT.PUT_LINE('====================');
    FOR i IN 1..arrarr.COUNT 
    LOOP
      DBMS_OUTPUT.PUT('line ' || i || ':');
      for j in 1..arrarr(i).count
      loop
        DBMS_OUTPUT.PUT('|' || arrarr(i)(j) || '|');
      end loop;
      DBMS_OUTPUT.PUT_LINE(CHR(10));
    END LOOP;
end;
/

结果

====================
0
0
1
1
====================
line 1:|1|
====================
line 1 count: 1
line 2 count: 3
====================
line 1:|1|

line 2:|11||21||31|

在这里插入图片描述
可以看到,oracle嵌套表中数据只要类型匹配,数据没有维度的对应关系:

也就是在下述实例中:

  type arr_num is table of number;
  type arr_arr_num is table of arr_num;

arr_arr_num类型的元素中的任意一个位置,都可以保存arr_num类型,无论arr_num类型中有几个元素。

例如上面实例中最终arr_num的数据存储:

arrarr{ 
    arr{ 1 }, 
    arr{ 11, 21, 31 }, 
}

arrarr(0).count == 1
arrarr(1).count == 3

Postgresql中的多维数组

PG中没有oracle中的嵌套表,往往会把PG的数组概念对应到Oracle的嵌套表上,因为数据逻辑存储形式都表现为数组。

但是除了语法上的差异外,与Oracle一个重大的差异就是PG中的多维数组维度必须统一,也就是每一行的列数必须相同,例如:

postgres=# select ARRAY[[1,2,3],[11,21,31]];
        array         
----------------------
 {{1,2,3},{11,21,31}}
(1 row)

postgres=# select ARRAY[[1],[11,21,31]];
ERROR:  multidimensional arrays must have array expressions with matching dimensions
postgres=# 

oracle中的嵌套表,可以做到第一行是[1],第二行是[11,21,31],推测oracle嵌套表类型是完全独立的一套类型系统,用指针数组实现,类似于C语言中的指针数组,使用比较灵活。

arrarr = [*p1, *p2]
 *p1 : [1]
 *p2 : [11,21,31]

所以把Oracle的嵌套表搬到PG上还是有些麻烦的,大部分功能应该都没有对标替换的方法,最好在内核支持。


下面介绍一些PG数组基操:

数组基本操作

CREATE TABLE sal_emp (
    name            text,
    pay_by_quarter  integer[],
    schedule        text[][]
);

INSERT INTO sal_emp
    VALUES ('Bill',
    '{10000, 10000, 10000, 10000}',
    '{{"meeting", "lunch"}, {"training", "presentation"}}');

INSERT INTO sal_emp
    VALUES ('Carol',
    '{20000, 25000, 25000, 25000}',
    '{{"breakfast", "consulting"}, {"meeting", "lunch"}}');


SELECT * FROM sal_emp;

postgres=# SELECT * FROM sal_emp;
 name  |      pay_by_quarter       |                 schedule                  
-------+---------------------------+-------------------------------------------
 Bill  | {10000,10000,10000,10000} | {{meeting,lunch},{training,presentation}}
 Carol | {20000,25000,25000,25000} | {{breakfast,consulting},{meeting,lunch}}
(2 rows)

数组读

postgres=# SELECT pay_by_quarter FROM sal_emp;
      pay_by_quarter       
---------------------------
 {10000,10000,10000,10000}
 {20000,25000,25000,25000}
(2 rows)

postgres=# SELECT pay_by_quarter[3] FROM sal_emp;
 pay_by_quarter 
----------------
          10000
          25000

数组读切片

postgres=# SELECT schedule FROM sal_emp WHERE name = 'Bill';
                 schedule                  
-------------------------------------------
 {{meeting,lunch},{training,presentation}}
(1 row)

postgres=# SELECT schedule[1:2] FROM sal_emp WHERE name = 'Bill';
                 schedule                  
-------------------------------------------
 {{meeting,lunch},{training,presentation}}
(1 row)

postgres=# SELECT schedule[1:2][1:1] FROM sal_emp WHERE name = 'Bill';
        schedule        
------------------------
 {{meeting},{training}}

http://www.niftyadmin.cn/n/328164.html

相关文章

怎么把文本翻译成英文?安利三个文本翻译方法

在当今全球化的时代,跨国交流和合作已经成为常态。然而,不同语言之间的沟通障碍经常阻碍着信息传递和理解。为了帮助我们更好地进行国际交流,文本翻译英文软件应运而生。这类软件能够将各种语言的文本迅速准确地翻译成英文,使我们…

Redis内存优化——ZSet类型介绍及底层原理详解

系列文章目录 Redis内存优化——String类型介绍及底层原理详解 Redis内存优化——Hash类型介绍及底层原理详解 Redis内存优化——List类型介绍及底层原理详解 Redis内存优化——Set类型介绍及底层原理详解 Redis内存优化——ZSet类型介绍及底层原理详解 文章目录 系列文章目录…

代码量原地缩减50%,这个Java工具类库太香了

Guava是google公司开发的一款Java类库扩展工具包,内含了丰富的API,涵盖了集合、缓存、并发、I/O等多个方面。使用这些API一方面可以简化我们代码,使代码更为优雅,另一方面它补充了很多jdk中没有的功能,能让我们开发中更…

飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

之前小编为大家介绍过在飞凌嵌入式i.MX6ULL开发板上操作GPIO的方法。本期,让我们一起走近i.MX9352处理器,深入了解这位i.MX系列新成员的GPIO该如何操作,以及它与前辈i.MX6ULL处理器又有哪些异同。 01 硬件原理分析 以点灯和按键为例&#xf…

360°VR全景图片,探索未知,畅游全景

随着科技的不断发展,人们对于视觉的需求越来越高,单一平面的图片已经无法满足人们的需要。360VR全景图片的出现填补了这个空白,它以其全景视角和互动体验,为我们带来了一场视觉盛宴。下面就让我们一起来探讨一下360VR全景图片的特…

有价值项目分享,缺项目可直接搜索(持续更新中)

​近来统计一下最近发的一些资源,包括CSDNB站微信公众号三个平台,仅包括Java资源(SSMSpringBootuniapp)、部分硬件、安卓资源,一共30758492588275个,可覆盖95%的毕业题目,大家可在相关归档内获取…

「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变

「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变 参考&鸣谢 HTTP1.0、HTTP1.1、HTTP2.0的关系和区别 doubleYong 计算机网络_HTTP1.0、HTTP1.1和HTTP2.0的区别 一只前端小马甲 文章目录 「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变一、先说结论二、HTTP网络请求过程三…

永磁直驱风力发电系统的仿真控制研究

摘要 风能是目前国内外应用较为广泛的一种绿色可再生能源,近几年我国风电产业的发展十分迅速。然后,越来越多的风力发电系统建并网,风力发电产生的电能受外界因素影响较大,具有一定的随机性和波动性,给并网后的电力系统…