上文 (https://hi.mogdb.org/posts/83bfca47/)讲到了系统视图的 user_tab_partitions ,不过他就是查询count 判断分区是否存在,具体改造如下:

1
select count(*) from user_tab_partitions where partition_name = 'xxx_partition'

其实在日常改造过程当中,虽然 pg 是以扩展来号称期方便的特性,其实没必要,国产化改造过程中,要尽可能的简单,满足业务需求,对于上面遇到的,虽然是查询 user_tab_partitions 视图,但是他主要是查询分区表是否存在,MogDB的 pg_partition 就可以满足要求。

1
select count(*) from pg_partition p where parttype=‘p’ and p.relname = 'xxx_partition‘ 

但是这次遇到的是查询 分区表的分区名称。pg 或者 MogDB 通过一个系统视图是无法替换的,他是查询某个表的分区名称。对于 oracle 来说通过 user_tab_partitions 很简单的就可以获取,但是 pg 或者 MogDB 需要两个表进行关联。

源SQL 如下:

1
select partition_name from user_tab_partitions where table_name='v_tablename' 

但是 MogDB 需要俩表进行关联如下,而要把这个写到存储过程中,比较繁琐。

1
2
3
4
5
6
7
8
9
select
pp.relname as part_name,
s.relname as table_part_name
from pg_partition pp
join pg_class s on pp.parentid = s.oid
where pp.parttype = 'p'
and pp.parentid = (
select oid from pg_class where relname = 't_part_noindex'
);

就在当前 schema 下 创建 user_tab_partitions 的视图

由于目前 ORACLE 的系统视图是轻度使用,不打算使用 compat-tools,如果日常或者应用重度依赖 ORACLE 的系统视图,建议安装 compat-tools 插件。

创建 user_tab_partitions 的视图,注意这个视图跟 ORACLE 的原视图不等价,但是可以满足本次业务

1
2
3
4
create view user_tab_partitions as
select pp.relname as partition_name ,s.relname as table_name
from pg_partition pp
join pg_class s on pp.parentid=s.oid where pp.parttype='p'
1
2
3
4
5
6
MogDB=> create view user_tab_partitions as
MogDB$> select pp.relname as partition_name ,s.relname as table_name
MogDB$> from pg_partition pp
MogDB$> join pg_class s on pp.parentid=s.oid where pp.parttype='p'
MogDB$> ;
CREATE VIEW
1
2
3
4
5
6
7
8
9
MogDB=> select partition_name,table_name from user_tab_partitions where table_name='t_part_noindex';
partition_name | table_name
----------------+----------------
p4 | t_part_noindex
p3 | t_part_noindex
p2 | t_part_noindex
p1 | t_part_noindex
(4 rows)

原文作者: Hi.MogDB

原文链接: https://hi.mogdb.org/posts/5c604ee4/

许可协议: 知识共享署名-非商业性使用 4.0 国际许可协议