CREATE TYPE typename ( INPUT = input_function, OUTPUT = output_function , INTERNALLENGTH = { internallength | VARIABLE } [ , EXTERNALLENGTH = { externallength | VARIABLE } ] [ , DEFAULT = "default" ] [ , ELEMENT = element ] [ , DELIMITER = delimiter ] [ , SEND = send_function ] [ , RECEIVE = receive_function ] [ , PASSEDBYVALUE ] )
CREATE TYPE 需要在定义类型之前先注册两个函数(用创建函数命令).新的基本类型的形式由 input_function 决定,它将该类型的外部形式转换成可以被对该类型操作的操作符和函数识别的形式.自然,output_function 用做相反用途.输入和输出函数都必须定义成接收一个或两个类型为 "opaque" 的参数的函数.
新的基本数据类型可定义成为定长,这时 internallength 是一个正整数,也可以是变长的,这时 Postgres 假定新类型的格式和 Postgres 所支持的"text" 类型是一样的.要指明一个类型是变长,将 internallength 设成 VARIABLE. 类似的,外部形式也用 externallength 关键字声明.
要指明一个类型是数组以及指明一个类型有数组元素.应该使用element关键字.例如,定义一个4-字节整数("int4"),声明如下
ELEMENT = int4要声明用于这种类型数组的分隔符,可设置 delimiter 声明分隔符.缺省的分隔符是逗号 (",").
一个可选的的缺省值可用于令用户声明某种位模式来代表"数据不存在".用 DEFAULT 关键字声明缺省值.
可选的函数 send_function 和 receive_function 用于请求 Postgres 服务的应用程序和 Postgres 数据库不在同一台机器的场合.在这种情况下,Postgres 运行的机器所用的数据类型格式可能和远端机器的不一样.在这种情况下,将服务器到客户端的数据转换成一个标准格式,当服务器收到从客户端来的数据时再转换成机器的格式是合适的.如果没有这样的函数声明,就假设内部数据格式可以被任何相关的硬件体系接受.比如, 如果在一台 Sun-4 和一台 DECstation 之间传递数据,单字节数据就不必转换,但许多其他类型需要(转换).
可选的标签,PASSEDBYVALUE,表明使用该数据类型的操作符或函数应该传递一个参数的值而不是引用(形参).要注意对内部格式超过4-字节的类型你不能传递参数值.
对于新的基本类型,用户可以通过本节描述的一些功能定义操作符,函数和聚集.
CREATE TYPE box (INTERNALLENGTH = 8, INPUT = my_procedure_1, OUTPUT = my_procedure_2); CREATE TABLE myboxes (id INT4, description box);这条命令创建一个变长数组类型, 其数组元素的类型是整数.
CREATE TYPE int4array (INPUT = array_in, OUTPUT = array_out, INTERNALLENGTH = VARIABLE, ELEMENT = int4); CREATE TABLE myarrays (id int4, numbers int4array);这条命令创建一个大对象类型并用其创建了一个表:
CREATE TYPE bigobj (INPUT = lo_filein, OUTPUT = lo_fileout, INTERNALLENGTH = VARIABLE); CREATE TABLE big_objs (id int4, obj bigobj);