2012-03-16 54 views
1

如何通过PreparedStatement添加PostgreSQL复合类型?
复合类型是:JDBC PreparedStatement:如何添加复合类型

CREATE TYPE fullcontact AS (address address,contacts contact); 
ALTER TYPE fullcontact OWNER TO postgres; 
COMMENT ON TYPE fullcontact IS 'Describe a type for a contact info with phone, email, and address'; 

我想添加它通过

FullContact fc = (FullContact)value; 
PGobject pgObj = castToPGObject(fc); 
PreparedStatement st = [this is a reference i obtain from a method]; 
st.setObject(index,pgObj); 

castToPGObjectFullContact实例转换到行格式。这是一个实例的转换结果:

ROW(ROW('Italy','Country',null,10,'1202'),ROW('email','aPhone','aMobile',null)) 

使用它就像一个魅力的INSERT,但是当我尝试使用PreparedStatement失败。 我已经看了JDBC驱动程序的代码,它似乎不支持STRUCT类型的PostgreSQL。我错过了什么吗?

setObject我得到,而不是正确的转换PreparedStatement增加'它不应该。例如,而不是上面的行我得到:

'ROW(ROW(''Italy'',''Country'',null,10,''1202''),ROW(''email'',''aPhone'',''aMobile'',null))' 

而这失败,因为它不会再被识别为一个结构。我也尝试加入

st.setEscapeProcessing(false); 

但仍然添加'。我需要使用PreparedStatement,因为我在定义自定义usertype时遇到了一个问题。
我正在考虑加入JDBC Driver项目来尝试添加对STRUCT对象的支持。

回答

1

行构造函数ROW()是PostgreSQL 函数调用。您需要通过 - 或者确切地说:表示组合类型的字符串文字。

试试这个语法:

SELECT '("(Italy,""Country with space"",,10,1202)" 
     ,"(email,aPhone,aMobile,)")'::fullcontact 

所以,你的价值将是:

("(Italy,""Country with space"",,10,1202)","(email,aPhone,aMobile,)") 

我把“国家与空间”展示与特殊字符的语法。
阅读关于composite value input in the manual的详细信息。

+0

对不起......问题不在于SQL本身,而在于使用了准备好的语句,它没有给我机会来设置结构类型......我的意思是,当我将正确的字符串添加到一个转义发生给我错误的结果,我已经在我的问题上报告了......星期一我会尝试发布一个完整的示例......但是,感谢您对语言的支持和更正;-) – quonn 2012-03-18 00:06:13