可以在postgres中创建自定义类型而无需在C中编写函数吗?

时间:2015-06-29 18:33:02

标签: postgresql postgresql-9.3

我尝试创建一种类型来存储颜色,最好以字节形式存储。我按照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的唯一方法?还有另外一种方法吗?我的目标是将颜色存储为字节,但其原生文本形式为十六进制(用于从原始转储,恢复和转换)。

1 个答案:

答案 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。

鉴于上述情况:

  1. 基本数据类型输入和输出函数使用cstring。
  2. 程序语言不能使用cstring。
  3. 基本数据类型函数不能用过程语言编写。
  4. 定义基本数据类型不能完全用过程语言来完成。
  5. 您可以使用预先存在的输入和输出功能,但我不这么认为 他们中的任何一个都会直接得到一个十六进制字符串。最近的 可能是\ x十六进制转义的bytea,但你的文本表示的开头有一个\ x。如果您愿意使用文本进行强制转换,我认为您可以使用bytea_in和bytea_out创建一个类型,并在文本中编写自定义强制转换。您必须明确强制转换以避免使用\ x。。