Как написать собственный тип данных структуры для PostgreSQL, используя внутренние типы
Я использую PostgreSQL 9.6. Я хотел бы создать новое расширение типа валюты на PostgreSQL, которое содержит строку и числовое значение.
Согласно документации https://www.postgresql.org/docs/9.6/static/sql-createtype.html, я могу использовать тип compose напрямую в PostgreSQL, но это не то, что я хочу, потому что я хочу иметь возможность представлять тип с использованием строки и делать приведение. Таким образом, решение состоит в том, чтобы создать пользовательский тип, такой как тип "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)), для определения моей структуры? Могу ли я использовать функцию numeric_in внутри моей функции currency_in?
1 ответ
И то и другое character
а также numeric
являются varlena
поэтому вы не сможете хранить их в структуре данных фиксированной длины.
Я бы определил тип данных как
typedef struct {
/* value times 100 */
int64 value;
/* currency name */
char denomination[4];
} currency;
Хранение последних символов позволяет избежать проблем с выравниванием.
Операции над значением теперь являются простыми целочисленными операциями. Я не ожидаю, что вы хотите умножить или разделить два currency
ценности; это не имеет большого смысла.