我尝试创建一种类型来存储颜色,最好以字节形式存储。我按照postgres文档中的所有说明进行操作:http://www.postgresql.org/docs/9.3/static/sql-createtype.html
并找到了normal Default value. Break words according to their usual rules
break-all Lines may break between any two letters
keep-all Breaks are prohibited between pairs of letters
initial Sets this property to its default value. Read about initial
inherit Inherits this property from its parent element. Read about
有点......令人不安的部分。省略号中有什么?事实证明这是合理的,因为我找不到任何创建简单数据类型的例子,没有用C编写的自定义PG函数。
我最好的尝试是:
CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
这会产生错误:
CREATE TYPE color;
CREATE FUNCTION color_in(cstring) RETURNS color AS $$
BEGIN
RETURN decode($1::text, 'hex')::color;
END;
$$ LANGUAGE PLPGSQL IMMUTABLE RETURNS NULL ON NULL INPUT;
CREATE FUNCTION color_out(color) RETURNS cstring AS $$
BEGIN
RETURN encode($1::bytea, 'hex')::text;
END;
$$ LANGUAGE PLPGSQL IMMUTABLE RETURNS NULL ON NULL INPUT;
CREATE TYPE color (
INTERNALLENGTH = 3,
LIKE = bytea,
INPUT = color_in,
OUTPUT = color_out
);
如果我使用Language SQL或默认使用SPL,则会出现类似错误。 此处列出了示例输入输出函数:http://www.postgresql.org/docs/9.3/static/xtypes.html。唯一的示例函数是用C语言编写的。我是否正确认为这是在postgres中编写UDT的唯一方法?还有另外一种方法吗?我的目标是将颜色存储为字节,但其原生文本形式为十六进制(用于从原始转储,恢复和转换)。
答案 0 :(得分:3)
来自http://www.postgresql.org/docs/9.4/interactive/datatype-pseudo.html
以过程语言编码的函数只能使用伪类型 他们的实施语言允许。目前的程序 语言都禁止使用伪类型作为参数类型,并允许 只有void并记录为结果类型(加上函数时的触发器) 用作触发器)。有些还支持使用多态函数 anyelement,anyarray,anynonarray,anyenum和anyrange。
从创建类型的文档 http://www.postgresql.org/docs/9.4/interactive/sql-createtype.html
输入函数可以声明为带一个类型的参数 cstring,或者取三个类型为cstring,oid,integer的参数。
输出函数必须返回类型cstring。
鉴于上述情况:
您可以使用预先存在的输入和输出功能,但我不这么认为 他们中的任何一个都会直接得到一个十六进制字符串。最近的 可能是\ x十六进制转义的bytea,但你的文本表示的开头有一个\ x。如果您愿意使用文本进行强制转换,我认为您可以使用bytea_in和bytea_out创建一个类型,并在文本中编写自定义强制转换。您必须明确强制转换以避免使用\ x。。