用户定义类型所需要的函数
一个用户定义的类型总是有输入和输出函数.这些函数决定该类型如何在字串里出现(让用户输入和输出给用户)和类型如何在存储器里组织.输入函数以一个以空(null)为分隔符的字符串为输入并且返回该类型的内部(在存储器里)的表现形式.输出类型以该类型的内部表现形式为输入并且返回一个以空(null)为分隔符的字符串.假设我们要定义一个复数类型用来表示复数.通常,我们选用下面的
C
结构来在存储器里表现复数:
typedef struct Complex {
double x;
double y;
} Complex;
并且以 (x,y) 形式的字串做为外部的表现形式.这些函数通常比较容易写,尤其是输出函数.不过,我们还是要注意几点:
当定义你的外部(字符串)表现形式时,要注意你最后必须为该表现形式写一个完整而且健壮的分析器作为你的输入函数!
Complex *
complex_in(char *str)
{
double x, y;
Complex *result;
if (sscanf(str, " ( %lf , %lf )", &x, &y) != 2) {
elog(WARN, "complex_in: error in parsing
return NULL;
}
result = (Complex *)palloc(sizeof(Complex));
result->x = x;
result->y = y;
return (result);
}
输出函数可以简单的就是:
char *
complex_out(Complex *complex)
{
char *result;
if (complex == NULL)
return(NULL);
result = (char *) palloc(60);
sprintf(result, "(%g,%g)", complex->x, complex->y);
return(result);
}
你应该把你的输入和输出函数做的互为逆(函数).如果你不这样做,你就可能在需要把数据输出来在装载回去时碰到很严重的问题(比如,输入到别人在另外的计算机上的数据库中去).当涉及到浮点数时,这是非常普遍的问题.
要定义
complex 类型,我们要在创建该类型前先创建两个用户定义函数
complex_in 和 complex_out:
CREATE FUNCTION complex_in(opaque)
RETURNS complex
AS 'PGROOT/tutorial/obj/complex.so'
LANGUAGE 'c';
CREATE FUNCTION complex_out(opaque)
RETURNS opaque
AS 'PGROOT/tutorial/obj/complex.so'
LANGUAGE 'c';
CREATE TYPE complex (
internallength = 16,
input = complex_in,
output = complex_out
);
正如我们前面讨论的,
Postgres 完全支持基本类型的数组.另外,
Postgres
同样还支持用户定义类型的数组.当你定义类型时,
Postgres
自动提供对该类型的数组的支持.因为历史原因,数组类型的类型名是与类型同名字串前面加个下划线
_ .不需要为复合类型定义任何函数,因为系统已经知道它们在里面看起来象什么.