如何使用libpq插入此自定义数据类型?

时间:2014-08-07 21:46:34

标签: c++ postgresql libpq compositetype

使用libpq插入一些数据时遇到了一些困难。我有两种自定义数据类型:

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

我想在一个包含rotate_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);

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

这有效(在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的不同语法。试试这个表格。

答案 1 :(得分: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)\")')");