CREATE TYPE
Defines a newdata type.
概要
CREATETYPE name AS ( attribute_name data_type [, ... ] )
CREATETYPE name (
INPUT= input_function,
OUTPUT= output_function
[,RECEIVE = receive_function]
[,SEND = send_function]
[,INTERNALLENGTH = {internallength | VARIABLE}]
[,PASSEDBYVALUE]
[,ALIGNMENT = alignment]
[,STORAGE = storage]
[,DEFAULT = default]
[,ELEMENT = element]
[,DELIMITER = delimiter] )
CREATETYPE name
描述
CREATE TYPE为注册在当前数据库中使用新的数据类型。谁定义该类型的用户成为其所有者。
CREATE TYPE命令在当前数据库中注册一个新的数据类型。定义这个数据类型的用户就成为这个类型的属主。
如果给出模式名,那么该类型是在指定模式中创建。否则它会在当前模式中创建。类型名称必须在同一个模式中的现有类型或域的名称不同。该类型的名称也必须从同模式中的表的名称不同。
CompositeTypes
CREATE TYPE的第一种形式创建一个复合类型。复合类型是由属性名和数据类型的列表中指定。这是基本相同的行类型的表,但使用CREATE TYPE避免了在定义一个类型需要建立一个实际的表。一个独立的复合类型作为parameter 或者返回类型的功能非常有用。
Base Types
第二种形式的CREATE TYPE创建一个新的基本类型(标量类型)。参数可能会以任何顺序显示,不仅在语法中显示,大多数都是可选的。在定义类型之前,必须注册两个或多个函数(使用CREATE FUNCTION)。支持函数input_function和output_function是必需的,而函数receive_function,send_function和analyze_function是可选的。通常这些功能必须用C或其他低级语言编码。在Greenplum数据库中,用于实现数据类型的任何函数必须定义为IMMUTABLE。
input_function将类型的外部文本表示转换为为类型定义的操作符和函数使用的内部表示。 output_function执行反向转换。输入函数可以被声明为采用cstring类型的一个参数,或者使用cstring,oid,integer类型的三个参数。第一个参数是输入文本作为C字符串,第二个参数是类型自己的OID(数组类型除外,而是接收其元素类型的OID),第三个参数是目标列的typmod(如果已知的话) 1将不会通过)。输入函数必须返回数据类型本身的值。通常,输入函数应声明为STRICT;如果不是,当读取NULL输入值时,将使用NULL第一个参数调用它。在这种情况下,函数必须返回NULL,除非它引发错误。 (这种情况主要是为了支持域输入功能,可能需要拒绝NULL输入。)输出函数必须声明为采用新数据类型的一个参数。
输出函数必须返回类型cstring。输出函数不会为NULL值调用。
Array Types
每当创建一个用户自定义数据类型,Greenplum数据引擎会自动创建一个与之关联的数组类型,其名字由一个下划线前缀基本类型的名字。
分析器理解这个命名传统,并且把对类型为foo []的字段的请求转换类型_foo请求。这个隐含创建的数组类型是变长并且使用内建的输入和输出功能array_in和array_out。
你可能会问,为什么有一个元素的选择,如果系统制作正确的数组类型自动。它使用元素的有用的唯一情况是,当你制作的恰好是内部的_些相同事物的数组固定长度的类型,要允许这些东西可以通过脚标直接访问,除了您打算什么作业提供该类型作为一个整体。例如,键入name就允许其构成char用这种方法。 A 2-D点的类型可能会允许像点[0]并访问它的两个构成[1]。请注意这个功能只适用于定长类型的内部形式是一个相同定长域的序列。
一个标化的变长类型必须有被array_in和array_out使用的_般化的内部表现。由于历史原因,定长数组类型的脚标从零开始,而不是从一个为变长数组。
parameter
name
要创建的类型的名称(可选地,模式限定)。
attribute_name
复合类型的属性(列)的名称。
data_type
要成为复合类型列的现有数据类型的名称。
input_function
将数据从类型的外部文本形式转换为内部表单的函数的名称。
output_function
将数据从类型的内部表单转换为外部文本形式的函数的名称。
receive_function
将数据从类型的外部二进制形式转换为其内部形式的函数的名称。
send_function
将数据从类型的内部表单转换为其外部二进制形式的函数的名称。
internaHength
一个数字常量,用于指定新类型内部表示形式的长度(以字节为单位)。默认假设是可变长度。
alignment
数据类型的存储对齐要求。必须是char,int2,int4或double之一。默认值为int4。
storage
数据类型的存储策略,必须是plain, external, extended, or main 之一。默认是plain.
default
数据类型的默认值。如果省略,默认值为null。
element
正在创建的类型是数组;这指定了数组元素的类型。
delimiter
要由此类型组成的数组中的值之间使用的分隔符字符。
Notes
用户定义类型名不能以下划线(_)开始,只能是长62个字符(或者通常是NAMEDATALEN - 2,而不是NAMEDATALEN -1字符允许的其他名称)。以下划线开头的类型名被解析成内部创建的数组类型名。
因为数据类型在创建后没有使用上的限制,创建一个基本类型,无异于给予类型定义中提到的功能的public执行权限。 (类型的创建者因此需要拥有这些功能。)。
对于在类型定义中有用的各种功能,这通常不是问题。 但是,在设计一种类型之前,您可能需要三思而后行,以便在将其转换为外部形式时使用“秘密”信息。
在Greenplum数据库版本2.4之前,语法CREATE TYPE名称不存在。 创建新基类型的方法是首先创建其输入函数。 在这种方法中,Greenplum数据库将首先看到新数据类型的名称作为输入函数的返回类型。 在这种情况下隐式创建shell类型,然后可以在剩余I / O函数的定义中引用它。 这种方法仍然有效,但已被弃用,在以后的某些版本中可能会被禁止。 另外,为了避免由于函数定义中的简单拼写错误而导致shell类型的目录异常混乱,当输入函数写入C时,shell类型只能这样做。
示例
This examplecreates a composite type and uses it in a function definition:
CREATETYPE compfoo AS (f1 int, f2 text);
CREATEFUNCTION getfoo() RETURNS SETOF compfoo AS $$
SELECTfooid, fooname FROM foo
$$LANGUAGE SQL;
This examplecreates the base data type box and then usesthe type in a table definition:
CREATETYPE box;
CREATEFUNCTION my_box_in_function(cstring) RETURNS box AS
... ;
CREATEFUNCTION my_box_out_function(box) RETURNS cstring AS
... ;
CREATETYPE box (
INTERNALLENGTH= 16,
INPUT= my_box_in_function,
OUTPUT= my_box_out_function
);
CREATETABLE myboxes (
idinteger,
descriptionbox
);
If the internalstructure of box were an array of four float4 elements, we might instead use:
CREATETYPE box (
);
INTERNALLENGTH= 16,
INPUT= my_box_in_function,
OUTPUT= my_box_out_function,
ELEMENT= float4
which would allowa box value's component numbers to be accessed by subscripting. Otherwise thetype
behaves the sameas before.
This examplecreates a large object type and uses it in a table definition:
CREATETYPE bigobJ (
INPUT= lo_filein, OUTPUT = lo_fileout,
INTERNALLENGTH= VARIABLE
);
CREATETABLE big_obJs (
idinteger,
obJbigobJ
);
兼容性
This create type command is a Greenplum Databaseextension. There is a create type statement in the SQL standard that israther different in detail.
相关参考
CREATEFUNCTION, ALTERTYPE,DROP TYPE, CREATE DOMAIN