我试图创建一种类型,以字节形式存储颜色十六进制。我按照postgres文档中的所有说明进行操作,网址是:http://www.postgresql.org/docs/9.3/static/sql-createtype.html,在其中找到了这部分: CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
但是省略号里该填写什么让我感到有些不安。结果证明,我的不安是有道理的,因为我无法找到任何在不使用C语言自定义PG函数的情况下创建简单数据类型的示例。
我最好的尝试是:
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
);
这会导致错误:
NOTICE: return type color is only a shell
ERROR: PL/pgSQL functions cannot return type color
如果我使用语言SQL或默认为SPL,会出现类似的错误。这里列出了示例输入输出函数:http://www.postgresql.org/docs/9.3/static/xtypes.html。唯一的示例函数是用C编写的。我正确地认为这是在postgres中编写UDT的唯一方法吗?还有其他方法吗?我的目标是将颜色存储为字节,但其本机文本形式应为十六进制(用于转储、恢复和从原始数据进行转换)。
color_in
不存在。 - Nick Barnes