如何使用内部类型为PostgreSQL编写自定义结构数据类型

时间:2017-06-30 04:39:50

标签: c postgresql postgresql-extensions

我正在使用PostgreSQL 9.6。我想在PostgreSQL上创建一个包含字符串和数值的新货币类型扩展。

根据文档https://www.postgresql.org/docs/9.6/static/sql-createtype.html,我可以直接在PostgreSQL中使用compose类型,但这不是我想要的,因为我希望能够使用字符串来表示类型并进行转换。所以解决方案是创建一个自定义类型,例如示例" box"类型。文档显示:

CREATE TYPE box;

CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ;
CREATE FUNCTION my_box_out_function(box) RETURNS cstring AS ... ;

CREATE TYPE box (
   INTERNALLENGTH = 16,
   INPUT = my_box_in_function,
   OUTPUT = my_box_out_function
);

但是如何编写这样一个函数并不是很有帮助。进一步搜索显示该函数只能用C语言编写,并显示简单类型的示例,而不是结构类型。

所以我基本上想要像

这样的东西
typedef struct {
    char code[4];
    Numeric  numeric;
} Currency

我想使用固定类型的数字,这将避免我实现varlena标头的额外工作。除了货币通常有固定的小数点。我还希望能够在内部使用Numeric类型,因为它允许我重用Numeric函数。

我如何使用Numeric,这样我可以使用与PostgreSQL类似的语法(例如Numeric(10,2))来定义我的结构?我可以在currency_in函数中使用numeric_in函数吗?

1 个答案:

答案 0 :(得分:0)

characternumeric都是varlena,因此您无法将它们存储在固定长度的数据结构中。

我将数据类型定义为

typedef struct {
    /* value times 100 */
    int64 value;
    /* currency name */
    char denomination[4];
} currency;

最后存储字符可以避免对齐问题。

值的操作现在是简单的整数操作。我不希望你想要乘以或取两个currency值;这没什么意义。