PostgreSQL Oracle 兼容性之 - create type

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS PostgreSQL Serverless,0.5-4RCU 50GB 3个月
推荐场景:
对影评进行热评分析
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

标签

PostgreSQL , Oracle , create type , method , constructor , table type , composite type , domain , enum , range , operator , index , udf


背景

Oracle 自定义类型与PostgreSQL自定义类型的兼容性。

虽然两者用法上有一定的不同,但是PostgreSQL功能上完全覆盖到了Oracle的自定义类型。

下面从几个方面描述PostgreSQL Oracle create type的兼容性。

1、创建自定义类型

2、创建自定义类型的构造器

3、创建自定义类型的方法

4、创建基本类型的表类型

Oracle create type

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8001.htm#i2126568

实例:

1、创建自定义类型

CREATE TYPE demo_typ1 AS OBJECT (a1 NUMBER, a2 NUMBER);  

2、创建自定义类型的构造器

默认的构造器是与自定义类型同名的构造器。

CREATE TABLE demo_tab1 (b1 NUMBER, b2 demo_typ1);  
  
INSERT INTO demo_tab1 VALUES (1, demo_typ1(2,3));  -- demo_typ1就是类型名  

3、创建自定义类型的方法

通过member function指定方法。

CREATE TYPE demo_typ2 AS OBJECT (a1 NUMBER,    
   MEMBER FUNCTION get_square RETURN NUMBER);   

通过创建类型体,定义方法的实体。

CREATE TYPE BODY demo_typ2 IS  
   MEMBER FUNCTION get_square  
   RETURN NUMBER  
   IS x NUMBER;  
   BEGIN  
      SELECT c.col.a1*c.col.a1 INTO x  
      FROM demo_tab2 c;  
      RETURN (x);  
   END;  
END;  
/  

创建测试表,使用自定义类型

CREATE TABLE demo_tab2(col demo_typ2);   

使用默认构造器构造自定义类型的值

INSERT INTO demo_tab2 VALUES (demo_typ2(2));  

使用col.method_name调用自定义类型的方法

SELECT t.col.get_square() FROM demo_tab2 t;  
  
T.COL.GET_SQUARE()  
------------------  
                 4  

4、创建基本类型的表类型

CREATE TYPE textdoc_typ AS OBJECT  
    ( document_typ      VARCHAR2(32)  
    , formatted_doc     BLOB  
    ) ;  
  
CREATE TYPE textdoc_tab AS TABLE OF textdoc_typ;  

表类型通常用于在PL/SQL函数中,返回多条记录。

create or replace TYPE "STRINGS_TABLE" is table of varchar2(2000)    
    
create or replace FUNCTION highsoft_split(    
  p_str       IN long,       --VARCHAR2,    
  p_delimiter IN VARCHAR2)    
RETURN strings_table IS    
  j         INT := 0;    
  i         INT := 1;    
  len       INT := 0;    
  len1      INT := 0;    
  str       long;--VARCHAR2(2000);    
  str_split strings_table := strings_table();    
BEGIN    
  len  := LENGTH(p_str);    
  len1 := LENGTH(p_delimiter);    
  WHILE j < len LOOP    
    j := INSTR(p_str, p_delimiter, i);    
    IF j = 0 THEN    
      j   := len;    
      str := SUBSTR(p_str, i);    
      str_split.EXTEND;    
      str_split(str_split.COUNT) := str;    
      IF i >= len THEN    
        EXIT;    
      END IF;    
    ELSE    
      str := SUBSTR(p_str, i, j - i);    
      i   := j + len1;    
      str_split.EXTEND;    
      str_split(str_split.COUNT) := str;    
    END IF;    
  END LOOP;    
  RETURN str_split;    
END highsoft_split;    

效果如下

SQL> select * from table(highsoft_split('abc,d,e,f,g',','));    
    
COLUMN_VALUE    
--------------------------------------------------------------------------------    
abc    
d    
e    
f    
g    

PostgreSQL create type

PostgreSQL支持的类型更加丰富,一共分为6种。

https://www.postgresql.org/docs/devel/static/sql-createtype.html

https://www.postgresql.org/docs/devel/static/sql-altertype.html

1、复合类型

postgres=# create type new_box as (upper point, lower point);  
CREATE TYPE  
  
postgres=# create type tt as (c1 int, c2 int, c3 timestamp);  
CREATE TYPE  

不需要构造器,直接输入并制定类型即可:

postgres=# select ('(1,2)', '(3,9)')::new_box;  
        row          
-------------------  
 ("(1,2)","(3,9)")  
(1 row)  
  
postgres=# select (1,2,'2017-01-01 10:10:10')::tt;  
             row               
-----------------------------  
 (1,2,"2017-01-01 10:10:10")  
(1 row)  
  
postgres=# select tt $$(1,2,'2017-01-01 10:10:10')$$;  
             tt                
-----------------------------  
 (1,2,"2017-01-01 10:10:10")  
(1 row)  

2、域类型

属于一种限定值范围的类型,比如EMAIL,邮编等,有一定的规律,可以定义域类型,直接限定其范围。

CREATE DOMAIN us_postal_code AS TEXT  
CHECK(  
   VALUE ~ '^\d{5}$'  
OR VALUE ~ '^\d{5}-\d{4}$'  
);  
  
CREATE TABLE us_snail_addy (  
  address_id SERIAL PRIMARY KEY,  
  street1 TEXT NOT NULL,  
  street2 TEXT,  
  street3 TEXT,  
  city TEXT NOT NULL,  
  postal us_postal_code NOT NULL  
);  

使用起来与域的底层类型一样,所有与底层类型一致的操作符、函数都通用。比例这里的us_postal_code与text完全通用。

3、范围类型

范围类型顾名思义存的是一个范围。

CREATE TYPE float8_range AS RANGE (subtype = float8, subtype_diff = float8mi);  
  
create table tbl1 (id int, rg float8_range);  
  
postgres=# select float8_range(1.1,2);  
 float8_range   
--------------  
 [1.1,2)  
(1 row)  

4、枚举类型

一些常量值的集合,通常用于描述一些有限取值空间的内容。

CREATE TYPE bug_status AS ENUM ('new', 'open', 'closed');  
  
CREATE TABLE bug (  
    id serial,  
    description text,  
    status bug_status  
);  
  
ALTER TYPE colors RENAME VALUE 'purple' TO 'mauve';  
  
ALTER TYPE colors ADD VALUE 'orange' AFTER 'red';  

5、底层类型

通过C函数定义的类型,支持更加丰富的操作,包括支持索引接口,OP接口,UDF接口等。

5.1、操作符

5.2、AM

5.3、UDF

5.4、构造器(Input function, Output function)

5.5、方法(UDF)

底层类型的扩展,详见

https://www.postgresql.org/docs/devel/static/xtypes.html

https://www.postgresql.org/docs/devel/static/extend.html

6、表类型

PostgreSQL不需要表类型,因为在函数中返回setof type即返回多条记录(类似表的效果)。

当然如果你要在函数内存储多值,有两种方法:

1、临时表

2、数组

例子

do language plpgsql $$  
declare  
  v_tbl int[];  
begin  
  for i in 1..100 loop  
    v_tbl[i] := i*2;  
  end loop;  
  raise notice '%', v_tbl;  
end;  
$$;  
NOTICE:  {2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,44,46,48,50,52,54,56,58,60,62,64,66,68,70,72,74,76,78,80,82,84,86,88,90,92,94,96,98,100,102,104,106,108,110,112,114,116,118,120,122,124,126,128,130,132,134,136,138,140,142,144,146,148,150,152,154,156,158,160,162,164,166,168,170,172,174,176,178,180,182,184,186,188,190,192,194,196,198,200}  
DO  

Oracle PostgreSQL create type 转换

了解两种数据库对类型的使用方法差异后,就很容易进行转换。

1、创建自定义类型,Oracle通过定义方法来实现对新建类型的支持,而PG则是通过定义函数来对新建类型进行逻辑计算的支持。调用方法上存在差异。

oracle:

new_type_col.method()  

pg:

udf(new_type_col)  

2、创建自定义类型的构造器

oracle,默认构造器与类型同名。

PG,不需要构造器,可以直接使用::转换。

3、创建基本类型的表类型

PostgreSQL不需要构造表类型,可以在函数中returns setof new_type返回表。或者使用数组。

PostgreSQL在以上类型功能基础之上,增加了基本类型 枚举、范围、域 的支持。同时支持底层类型的扩展。

参考

https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8001.htm#i2126568

https://www.postgresql.org/docs/devel/static/sql-createtype.html

https://www.postgresql.org/docs/devel/static/sql-createdomain.html

相关实践学习
使用PolarDB和ECS搭建门户网站
本场景主要介绍基于PolarDB和ECS实现搭建门户网站。
阿里云数据库产品家族及特性
阿里云智能数据库产品团队一直致力于不断健全产品体系,提升产品性能,打磨产品功能,从而帮助客户实现更加极致的弹性能力、具备更强的扩展能力、并利用云设施进一步降低企业成本。以云原生+分布式为核心技术抓手,打造以自研的在线事务型(OLTP)数据库Polar DB和在线分析型(OLAP)数据库Analytic DB为代表的新一代企业级云原生数据库产品体系, 结合NoSQL数据库、数据库生态工具、云原生智能化数据库管控平台,为阿里巴巴经济体以及各个行业的企业客户和开发者提供从公共云到混合云再到私有云的完整解决方案,提供基于云基础设施进行数据从处理、到存储、再到计算与分析的一体化解决方案。本节课带你了解阿里云数据库产品家族及特性。
目录
相关文章
|
7月前
|
关系型数据库 分布式数据库 数据库
PolarDB PostgreSQL版:Oracle兼容的高性能数据库
PolarDB PostgreSQL版是一款高性能的数据库,具有与Oracle兼容的特性。它采用了分布式架构,可以轻松处理大量的数据,同时还支持多种数据类型和函数,具有高可用性和可扩展性。它还提供了丰富的管理工具和性能优化功能,为企业提供了可靠的数据存储和处理解决方案。PolarDB PostgreSQL版在数据库领域具有很高的竞争力,可以满足各种企业的需求。
|
3月前
|
Oracle NoSQL 关系型数据库
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
主流数据库对比:MySQL、PostgreSQL、Oracle和Redis的优缺点分析
586 2
|
7月前
|
人工智能 Oracle 关系型数据库
一篇文章弄懂Oracle和PostgreSQL的Database Link
一篇文章弄懂Oracle和PostgreSQL的Database Link
|
7月前
|
SQL Oracle 关系型数据库
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
常用数据库的分页语句(mySQL、oracle、PostgreSQL、SQL Server)
|
SQL Oracle 关系型数据库
Oracle,Postgresql等数据库使用
Oracle,Postgresql等数据库简单使用
173 0
Oracle,Postgresql等数据库使用
|
SQL Oracle 关系型数据库
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
Polar DB-O (兼容 Oracle 语法版本)和Polar DB PostgreSQL 版本概述(二)
1839 0
|
7月前
|
存储 Oracle 关系型数据库
PolarDB 开源版通过orafce支持Oracle兼容性
背景PolarDB 的云原生存算分离架构, 具备低廉的数据存储、高效扩展弹性、高速多机并行计算能力、高速数据搜索和处理; PolarDB与计算算法结合, 将实现双剑合璧, 推动业务数据的价值产出, 将数据变成生产力.本文将介绍PolarDB开源版通过orafce支持Oracle兼容性 .测试环境为m...
141 0
|
SQL Cloud Native 关系型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
ADBPG(AnalyticDB for PostgreSQL)是阿里云提供的一种云原生的大数据分析型数据库
1295 1
|
数据可视化 关系型数据库 MySQL
将 PostgreSQL 迁移到 MySQL 数据库
将 PostgreSQL 迁移到 MySQL 数据库
1782 2
|
SQL 存储 自然语言处理
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词
在当今社交媒体的时代,人们通过各种平台分享自己的生活、观点和情感。然而,对于平台管理员和品牌经营者来说,了解用户的情感和意见变得至关重要。为了帮助他们更好地了解用户的情感倾向,我们可以使用PostgreSQL中的pg_jieba插件对这些发帖进行分词和情感分析,来构建一个社交媒体情感分析系统,系统将根据用户的发帖内容,自动判断其情感倾向是积极、消极还是中性,并将结果存储在数据库中。
玩转阿里云RDS PostgreSQL数据库通过pg_jieba插件进行分词

相关产品

  • 云原生数据库 PolarDB
  • 云数据库 RDS PostgreSQL 版
  • 推荐镜像

    更多