У меня возникли трудности с вставкой некоторых данных с помощью 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);
Как это исправить?
Это работает (проверено в 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
, Попробуйте эту форму.
Меня поразило то, что экранированные двойные кавычки и круглые скобки необходимо использовать вокруг значений, представляющих поле пользовательского составного типа данных, для создания которого требуется более одного значения, поэтому:
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)\")')");