我正在使用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函数吗?
答案 0 :(得分:0)
character
和numeric
都是varlena
,因此您无法将它们存储在固定长度的数据结构中。
我将数据类型定义为
typedef struct {
/* value times 100 */
int64 value;
/* currency name */
char denomination[4];
} currency;
最后存储字符可以避免对齐问题。
值的操作现在是简单的整数操作。我不希望你想要乘以或取两个currency
值;这没什么意义。