Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用内部类型为PostgreSQL编写自定义结构数据类型_C_Postgresql_Postgresql Extensions - Fatal编程技术网

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

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

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

根据文档,我可以在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
我想使用固定类型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字节。