Postgresql 如果不在C中编写函数,可以在postgres中创建自定义类型吗?

Postgresql 如果不在C中编写函数,可以在postgres中创建自定义类型吗?,postgresql,postgresql-9.3,Postgresql,Postgresql 9.3,我正在尝试创建一个类型来存储颜色十六进制,最好是字节形式。我遵循了博士后文档中的所有说明: 并找到了它所说的CREATE FUNCTION my_box_in_FUNCTION(cstring)返回框为一点。。。令人不安的椭圆里有什么?事实证明这是合理的,因为我找不到任何没有用C编写的自定义PG函数创建简单数据类型的示例。 我最好的尝试是: CREATE TYPE color; CREATE FUNCTION color_in(cstring) RETURNS color AS $$ B

我正在尝试创建一个类型来存储颜色十六进制,最好是字节形式。我遵循了博士后文档中的所有说明: 并找到了它所说的
CREATE FUNCTION my_box_in_FUNCTION(cstring)返回框为一点。。。令人不安的椭圆里有什么?事实证明这是合理的,因为我找不到任何没有用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的默认值,则会出现类似错误。 此处列出了输入输出函数的示例:。唯一的示例函数是用C编写的。我假设这是在postgres中编写UDT的唯一方法,对吗?还有别的办法吗?我的目标是将颜色存储为字节,但其本机文本形式为十六进制(用于从原始数据转储、还原和强制转换)。

from

用过程语言编写的函数只能将伪类型用作 由其实现语言允许。目前程序上 所有语言都禁止使用伪类型作为参数类型,并允许 仅作废并记录为结果类型(函数 用作触发器)。有些还支持使用 类型包括anyelement、anyarray、anynonarray、anyenum和anyrange

和来自创建类型的文档

输入函数可以声明为接受一个类型为的参数 cstring,或采用cstring、oid、integer三种类型的参数

输出函数必须返回cstring类型

鉴于上述情况:

  • 基本数据类型输入和输出函数使用cstring
  • 过程语言不能使用cstring
  • 基本数据类型函数不能用过程语言编写
  • 定义基本数据类型不能完全用过程语言来完成
  • 您可以使用预先存在的输入和输出函数,但我不这么认为 它们中的任何一个都会直接给你一个十六进制字符串。最近的
    可能是由TEA转义的\x十六进制,但在文本表示的开头会有一个\x。如果您愿意在文本之间进行强制转换,我认为您可以使用bytea\u in和bytea\u out创建一个类型,并在文本之间编写自定义强制转换。不过,您必须显式强制转换以避免出现\x。

    将定义放在代码块底部的顶部如何?@Politank:不起作用,它会抱怨
    中的
    color\u不存在。仅供参考,Postgres的开发人员之一编写了a,并使用了24位RGB颜色作为示例。剩下要做的就是编译它。