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)