C 如何使用内部类型为PostgreSQL编写自定义结构数据类型
我正在使用PostgreSQL 9.6。我想在PostgreSQL上创建一个新的货币类型扩展,它包含一个字符串和一个数值 根据文档,我可以在PostgreSQL中直接使用compose类型,但这不是我想要的,因为我希望能够使用字符串表示类型并执行强制转换。因此,解决方案是创建一个自定义类型,例如示例“box”类型。文件显示:C 如何使用内部类型为PostgreSQL编写自定义结构数据类型,c,postgresql,postgresql-extensions,C,Postgresql,Postgresql Extensions,我正在使用PostgreSQL 9.6。我想在PostgreSQL上创建一个新的货币类型扩展,它包含一个字符串和一个数值 根据文档,我可以在PostgreSQL中直接使用compose类型,但这不是我想要的,因为我希望能够使用字符串表示类型并执行强制转换。因此,解决方案是创建一个自定义类型,例如示例“box”类型。文件显示: CREATE TYPE box; CREATE FUNCTION my_box_in_function(cstring) RETURNS box AS ... ; CRE
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
我想使用固定类型Numeric,这样可以避免实现varlena头的额外工作。此外,货币通常有固定的小数点。我还希望能够在内部使用Numeric类型,因为它允许我重用Numeric的函数
如何使用Numeric,以便使用与PostgreSQL类似的语法(例如Numeric(10,2))来定义我的结构?我可以在我的currency(货币)函数中使用numeric(货币)函数吗?字符和
数值
都是varlena
,因此无法将它们存储在固定长度的数据结构中
我将数据类型定义为
typedef结构{
/*价值乘以100*/
int64值;
/*货币名称*/
字符命名[4];
}货币;
最后存储字符可以避免对齐问题
对值的操作现在是简单的整数操作。我不希望您希望将两个
currency
值相乘或相除;这没有多大意义。我怀疑您实际上想要创建一个复合类型,而不是基类型。用这种方式做您想要做的事情需要做很多工作。您需要定义操作符、用于索引访问的操作符类以及更多。你需要对博士后的很多内在知识有一个扎实的了解;在C中,用户定义的数据类型对于全面实现来说并非微不足道。考虑一个域或复合类型。事实上,如何描述它是不起作用的,因为Valela头必须先出现。@凯文是的,但是复合类型我不能有自定义输出,也不能输入。我必须输入('USD',1)而不是'USD1'@CraigRinger,但是如果是固定大小的数字类型,您需要varlena标题吗。然后整个货币类型也是固定大小的。有趣的解决方案,是的,我看了代码,看起来货币类型共享一个类似的实现(使用整数存储值)。你能扩展一下对齐问题吗?我听说过这件事,但我对它不太熟悉。看。我说话马虎;这更像是浪费空间的问题。如果char
字段的长度为4字节,则在某些平台上可能会由于填充而浪费4字节。