Как мне вставить этот пользовательский тип данных с помощью libpq?

У меня возникли трудности с вставкой некоторых данных с помощью libpq. У меня есть два пользовательских типа данных:

create type size as (width real, height real);
create type rotated_rect as (angle real, center point, bounding_box box, size size)

и я хотел бы вставить запись в таблицу, которая имеет поле rotated_rect, поэтому для поля, использующего libpq, я собираю строковое значение:

paramv[3] = "(10.5,10.1,10.2,20,20,20,40,(5,5))";

Тем не менее, это дает мне ошибку: неверный синтаксис ввода для точки типа: «10.1»

Я также попробовал:

paramv[3] = "(10.5,(10.1,10.2),20,20,20,40,(5,5))"; -> invalid input syntax for "(10.1"paramv[3] = "(10.5,(10.1,10.2),(20,20,20,40),(5,5))"; -> as above

и команда sql, которую я использую:

res = PQexecParams(conn, "insert into test (r,b,s,rr) values ($1::real,$2::box,$3::size,$4::rotated_rect)", 4, NULL, paramv, NULL, NULL,0);

Как это исправить?

1

Решение

Это работает (проверено в Postgres 9.3):

SELECT '(10.5,"(10.1,10.2)","(20,20,20,40)","(5,5)")'::rotated_rect

Возвращает:

'(10.5,"(10.1,10.2)","(20,40),(20,20)","(5,5)")'

Обратите внимание на другой синтаксис для box, Попробуйте эту форму.

2

Другие решения

Меня поразило то, что экранированные двойные кавычки и круглые скобки необходимо использовать вокруг значений, представляющих поле пользовательского составного типа данных, для создания которого требуется более одного значения, поэтому:

paramv[0] = "(10.5,\"(10.1,10.2)\",\"(20,20,20,40)\",\"(5,5)\")";

Поскольку эта строка используется в качестве параметра, одинарные кавычки, которые обычно заключают внешнюю скобку, не нужны.

В не параметризованном запросе он будет реализован так с одинарными кавычками:

res = PQexec(conn, "insert into test (rr) values ('(10.5,\"(10.1,10.2)\",\"(20,20,20,40)\",\"(5,5)\")')");
2

А ты уже прошел курс программирования? Супер скидка!
Прокачать скилл $$$
×