2012-03-16 55 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