1

我正在使用 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 函数吗?

4

1 回答 1

2

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

我将数据类型定义为

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

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

对值的操作现在是简单的整数操作。我不希望您要乘以或除两个currency值;那没有多大意义。

于 2017-07-04T16:21:34.420 回答