Как написать собственный тип данных структуры для 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 ценности; это не имеет большого смысла.

Другие вопросы по тегам