PostgreSQL create type(兼容oracle)

pg中支持创建自定义类型create type,虽然和oracle中的自定义类型语法上有所差异,但是pg中的功能可以完全覆盖oracle中的自定义类型。

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

–创建自定义类型:

SQL> create type type1 as object (a1 number, a2 number);
  2  /

Type created.

–使用自定义类型

SQL> CREATE TABLE tab1 (b1 NUMBER, b2 type1);  

Table created.

SQL> INSERT INTO tab1 VALUES (1, type1(2,3)); 

1 row created.

–创建自定义类型的方法
通过member function指定方法。

SQL> CREATE TYPE type2 AS OBJECT (a1 NUMBER,    
MEMBER FUNCTION get_square RETURN NUMBER);  2  
  3  /

Type created.

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

SQL> CREATE or replace TYPE BODY type2 IS  
  2     MEMBER FUNCTION get_square  
   RETURN NUMBER  
   IS x NUMBER;  
  3    4    5     BEGIN  
  6        SELECT c.col.a1*c.col.a1 INTO x  
      FROM tab2 c;  
  7    8        RETURN (x);  
  9     END;  
 10  END;  
 11  /

Type body created.

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

SQL> SELECT t.col.get_square() FROM tab2 t;  

T.COL.GET_SQUARE()
------------------
                 4

PostgreSQL create type:
https://www.postgresql.org/docs/12/sql-createtype.html

PostgreSQL支持的类型更加丰富,一共分为6种,分别是:
复合类型、域类型、范围类型、枚举类型、底层类型、表类型。

下面举例说明:
–复合类型:

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

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

bill=# select ('(1,2)', '(3,9)')::new_box;  
        row        
-------------------
 ("(1,2)","(3,9)")
(1 row)

bill=# select ('(1,1)', '(9,9)')::new_box; 
        row        
-------------------
 ("(1,1)","(9,9)")
(1 row)

bill=# select (1,2,'2019-11-25 10:00:00')::tt;        
             row             
-----------------------------
 (1,2,"2019-11-25 10:00:00")
(1 row)

bill=# select tt $$(1,2,'2019-12-01 10:10:10')$$;     
             tt              
-----------------------------
 (1,2,"2019-12-01 10:10:10")
(1 row)

其它类型的创建方法可见官方文档链接。

oracle pg create type对比:
oracle中通过创建方法来对新建类型的支持,而pg中通过创建函数来对新建类型的支持,且两者在调用方法上也存在差异。

oracle:
new_type_col.method()

pg:
udf(new_type_col)

你可能感兴趣的:(PostgreSQL)