
# 系统表信息函数
#### format_type(type_oid, typemod)
描述：获取数据类型的SQL名称。
返回类型：text
备注：
format_type通过数据类型的类型OID以及可能的类型修饰词，返回其SQL名称。如果不知道具体的修饰词，则在类型修饰词的位置传入NULL。类型修饰词一般只对有长度限制的数据类型有意义。format_type所返回的SQL名称中包含数据类型的长度值，其大小是：实际存储长度len - sizeof(int32)，单位字节。数据存储时需要32位的空间来存储用户对数据类型的自定义长度信息，即实际存储长度要比用户定义长度多4个字节。在下例中，format_type返回的SQL名称为"character varying(6)"，6表示varchar类型的长度值是6字节，因此该类型的实际存储长度为10字节。
```
SELECT format_type((SELECT oid FROM pg_type WHERE typname='varchar'), 10);
     format_type      
----------------------
 character varying(6)
(1 row)
```
#### pg_check_authid(role_oid)
描述：检查是否存在给定oid的角色名。
返回类型：bool
#### pg_describe_object(catalog_id, object_id, object_sub_id)
描述：获取数据库对象的描述。
返回类型：text
备注：pg_describe_object返回由目录OID，对象OID和一个（或许0个）子对象ID指定的数据库对象的描述。这有助于确认存储在pg_depend系统表中对象的身份。
#### pg_get_constraintdef(constraint_oid)
描述：获取约束的定义。
返回类型：text
#### pg_get_constraintdef(constraint_oid, pretty_bool)
描述：获取约束的定义。
返回类型：text
备注：pg_get_constraintdef和pg_get_indexdef分别从约束或索引上使用创建命令进行重构。
#### pg_get_expr(pg_node_tree, relation_oid)
描述：反编译表达式的内部形式，假设其中的任何Vars都引用第二个参数指定的关系。
返回类型：text
#### pg_get_expr(pg_node_tree, relation_oid, pretty_bool)
描述：反编译表达式的内部形式，假设其中的任何Vars都引用第二个参数指定的关系。
返回类型：text
备注：pg_get_expr反编译一个独立表达式的内部形式，比如一个字段的缺省值。在检查系统表的内容的时候很有用。如果表达式可能包含关键字，则指定它们引用相关的OID作为第二个参数；如果没有关键字，设置为零即可。
#### pg_get_indexdef(index_oid)
描述：获取索引的CREATE INDEX命令。
返回类型：text
index_oid为索引的OID，可以通过PG_STATIO_ALL_INDEXES系统视图查询。
示例：查询索引ds_ship_mode_t1_index1的OID及其创建命令。
```
SELECT indexrelid FROM PG_STATIO_ALL_INDEXES WHERE indexrelname = 'ds_ship_mode_t1_index1';
 indexrelid
------------
     136035
(1 row)
SELECT * FROM pg_get_indexdef(136035);
                                                pg_get_indexdef
---------------------------------------------------------------------------------------------------------------
 CREATE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1 USING psort (sm_ship_mode_sk) TABLESPACE pg_default
(1 row)
```
#### pg_get_indexdef(index_oid, column_no, pretty_bool)
描述：获取索引的CREATE INDEX命令，或者如果column_no不为零，则只获取一个索引字段的定义。
返回类型：text
```
SELECT * FROM pg_get_indexdef(136035,0,false);
                                                pg_get_indexdef
---------------------------------------------------------------------------------------------------------------
 CREATE INDEX ds_ship_mode_t1_index1 ON tpcds.ship_mode_t1 USING psort (sm_ship_mode_sk) TABLESPACE pg_default
(1 row)
SELECT * FROM pg_get_indexdef(136035,1,false);
 pg_get_indexdef
-----------------
 sm_ship_mode_sk
(1 row)
```
#### pg_get_keywords()
描述：获取SQL关键字和类别列表。
返回类型：setof record
备注：pg_get_keywords返回一组关于描述服务器识别SQL关键字的记录。word列包含关键字。catcode列包含一个分类代码：U表示通用的，C表示列名，T表示类型或函数名，或R表示保留。catdesc列包含了一个可能本地化描述分类的字符串。
#### pg_get_ruledef(rule_oid)
描述：获取规则的CREATE RULE命令。
返回类型：text
#### pg_get_ruledef(rule_oid, pretty_bool)
描述：获取规则的CREATE RULE命令。
返回类型：text
#### pg_get_userbyid(role_oid)
描述：获取给定OID的角色名。
返回类型：name
备注：pg_get_userbyid通过角色的OID抽取对应的用户名。
#### pg_get_viewdef(viewname text \[, pretty bool \[, fullflag bool\]\])
描述：为视图获取底层的SELECT命令。
返回类型：text
备注：
- pg_get_viewdef重构定义视图的SELECT查询。pretty bool参数为true时，显示格式"适合打印"，且该格式易读。pretty bool参数缺省值为false，显示格式不易读。如果用于转储，那么尽可能使用缺省格式。pretty bool参数只对有效视图生效。
- fullflag bool参数为true时，显示视图的完整定义。其缺省值为false。
 
#### pg_get_viewdef(viewoid oid \[, pretty bool \[, fullflag bool\]\])
描述：为视图获取底层的SELECT命令。
返回类型：text
#### pg_get_viewdef(view_oid, wrap_column_int)
描述：为视图获取底层的SELECT命令；行字段被换到指定的列数，打印是隐含的。
返回类型：text
#### pg_get_tabledef(table_oid)
描述：根据表的OID获取表定义。
返回类型：text
示例：先通过系统表pg_class获取表customer_t2的OID，再使用此函数查询表customer_t2的定义，可获取创建表customer_t2时的表字段，表的存储方式（行存或列存）及表的分布方式等信息。
```
select oid from pg_class where relname ='customer_t2';
  oid
-------
 17353
(1 row)
select * from pg_get_tabledef(17353);
              pg_get_tabledef
--------------------------------------------
 SET search_path = dbadmin;                +
 CREATE  TABLE customer_t2 (               +
         state_id character(2),            +
         state_name character varying(40), +
         area_id numeric                   +
 )                                         +
 WITH (orientation=column, compression=low)+
 DISTRIBUTE BY HASH(state_id)              +
 TO GROUP group_version1;
(1 row)
```
#### pg_get_tabledef(table_name)
描述：根据表名获取表定义。
返回类型：text
备注：pg_get_tabledef重构出表定义的CREATE语句，包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息，需要用户自己去创建，表定义里不会有这些对象的创建语句。
#### pg_get_tabledef(table_name/table_oid, forCreate boolean)
描述：根据表名或者表的OID获取表定义。该函数仅9.1.0.100及以上集群版本支持。
返回类型：text
- forCreate参数为true时获得的表定义中不带TO GROUP
- forCreate参数为false时获得的表定义中含有TO GROUP。
 
#### pg_get_tabledef(table_name/table_oid, forCreate boolean,withColComm boolean)
描述：根据表名或者表的OID获取表定义。该函数仅9.1.0.200及以上集群版本支持。
返回类型：text
- withColComment参数为true时，列字段的comment紧随对应字段显示。
- withColComment参数为false时，列字段的comment显示在表定义内容的末尾。
示例：
```
SELECT pg_get_tabledef('person',false,true);
                  pg_get_tabledef                   
----------------------------------------------------
 SET search_path = public;                         +
 CREATE  TABLE person (                            +
         id integer COMMENT '学号',                +
         name character varying(25) COMMENT '姓名',+
         address text COMMENT '地址'               +
 )                                                 +
 WITH (orientation=row, compression=no)            +
 DISTRIBUTE BY ROUNDROBIN                          +
 TO GROUP group_version1;
(1 row)
SELECT pg_get_tabledef('person',false,false);
               pg_get_tabledef               
---------------------------------------------
 SET search_path = public;                  +
 CREATE  TABLE person (                     +
         id integer,                        +
         name character varying(25),        +
         address text                       +
 )                                          +
 WITH (orientation=row, compression=no)     +
 DISTRIBUTE BY ROUNDROBIN                   +
 TO GROUP group_version1;                   +
 COMMENT ON COLUMN person.id IS '学号';     +
 COMMENT ON COLUMN person.name IS '姓名';   +
 COMMENT ON COLUMN person.address IS '地址';
(1 row)
```
#### pg_get_stat_expressions(oid)
描述：获取扩展统计信息对象中的表达式。仅8.2.1.200及以上集群版本支持。
返回类型：text \[\]
#### pg_options_to_table(reloptions)
描述：获取存储选项名称/值对的集合。
返回类型：setof record
备注：pg_options_to_table当通过pg_class.reloptions或pg_attribute.attoptions时返回存储选项名字/值对（option_name/option_value）的集合。
示例：
```
CREATE TABLE customer_test
(
  state_ID   CHAR(2),
  state_NAME VARCHAR2(40),
  area_ID    NUMBER
)
WITH (ORIENTATION = COLUMN,COMPRESSION=middle);
```
```
SELECT pg_options_to_table(reloptions) FROM pg_class WHERE relname='customer_test';
pg_options_to_table
----------------------
 (orientation,column)
 (compression,middle)
 (bucketnums,16384)
 (colversion,2.0)
 (enable_delta,false)
(5 rows)
```
#### pg_typeof(any)
描述：获取任何值的数据类型。
返回类型：regtype
备注：
pg_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype，这是一个OID别名类型（请参考[对象标识符类型](https://support.huaweicloud.com/sqlreference-dws/dws_06_0022.html)）；这意味着它是一个为了比较而显示类型名字的OID。
示例：
```
SELECT pg_typeof(33);
 pg_typeof 
-----------
 integer
(1 row)
SELECT typlen FROM pg_type WHERE oid = pg_typeof(33);
 typlen 
--------
      4
(1 row)
```
#### collation for (any)
描述：获取参数的排序。
返回类型：text
备注：
表达式collation for返回传递给他的值的排序。示例：
```
SELECT collation for (description) FROM pg_description LIMIT 1;
 pg_collation_for 
------------------
 "default"
(1 row)
```
值可能是引号括起来的并且模式限制的。如果没有为参数表达式排序，则返回一个null值。如果参数不是排序的类型，则抛出一个错误。
#### getdistributekey(table_name)
描述：获取一个hash表的分布列。
返回类型：text
示例：
```
SELECT getdistributekey('item');
 getdistributekey 
------------------
 i_item_sk
(1 row)
```
