我在Postgresql中有一个表
DROP TABLE xml_docs;
CREATE TABLE xml_docs(
id serial PRIMARY KEY,
cad_number character(50),
gkuzu_name character(50),
gkuzu xml,
rreq_name character(50),
rreq xml
)
我使用JDBC进行数据库连接。我想在表格中插入整个xml文档 我该怎么做?
更新
奥基。我试试
String sql = "INSERT INTO xml_docs(cad_number,gkuzu_name,gkuzu,rreq_name,rreq) VALUES(?,?,?,?,?)";
PreparedStatement stmt = ce.prepareStatement(sql);
stmt.setString(1, "11:33:5464563");
stmt.setString(2, xml_gkuzu.getName());
stmt.setString(3, xml_gkuzu.toString());
stmt.setString(4, xml_rreq.getName());
stmt.setString(5, xml_rreq.toString());
stmt.executeQuery();
ce.close();
se.close();
并获得exeption
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: column "gkuzu" is of type xml but expression is of type character varying
Подсказка: You will need to rewrite or cast the expression.
怎么了?
更新2
当我尝试这样做时
String sql1 = "INSERT INTO xml_docs(cad_number,gkuzu_name,gkuzu,rreq_name,rreq) VALUES(11335464563,"+xml_gkuzu.getName()+",XMLPARSE("+xml_gkuzu.toString()+"),"+xml_rreq.getName()+",XMLPARSE("+xml_rreq.toString()+"))";
我得到了例外
Exception in thread "main" org.postgresql.util.PSQLException: ERROR: syntax error at or near "bf48e000b0"
答案 0 :(得分:6)
我不确定,但试试这个:
首先将XML转换为Java String。 然后创建一个insert语句并使用PostgreSQL的XMLPARSE方法将您的值转换为PostgreSQL的xml类型:
INSERT INTO xml_docs(id, gkuzu) VALUES (1, XMLPARSE('<foo><bar>Hello</bar></foo>'));
请参阅:http://wiki.postgresql.org/wiki/XML_Support
<强>更新强>
Java代码示例:
String sql = "INSERT INTO xml_docs(id, gkuzu) VALUES (?, XMLPARSE(?))";
[...]
stmt.setString(2, "<foo>Hello World!</foo>");
这应该创建这个声明:
INSERT INTO xml_docs(id, gkuzu) VALUES (1, XMLPARSE('<foo>Hello World!</foo>'));
答案 1 :(得分:3)
如果您没有使用libxml支持构建的Postgres,则更新accepted answer:
Java代码示例:
String sql = "INSERT INTO xml_docs(id, gkuzu) VALUES (?, XML(?))";
[...]
stmt.setString(2, "<foo>Hello World!</foo>");
这应该创建这个声明:
INSERT INTO xml_docs(id, gkuzu) VALUES (1, XML('<foo>Hello World!</foo>'));
因此,对于版本9.0及更高版本,您可能需要切换XMLPARSE
==&gt; XML
。否则,您需要特殊支持XMLPARSE
此处不再重复用于转换为xml类型的函数式表达式xmlparse和xmlserialize。使用大多数这些功能需要使用configure --with-libxml构建安装。
答案 2 :(得分:3)
您可以使用JDBC 4 SQLXML来代替使用PostgreSQL专有语法重写insert语句:
String xml = xml_gkuzu.toString();
SQLXML sqlxml = connection.createSQLXML();
sqlxml.setString(xml);
stmt.setSQLXML(3, sqlxml);
答案 3 :(得分:2)
虽然postgres具有本地XML Data type
,但是从java端开始,你可以处理普通字符串
您可以将xml文档转换为String并插入,它应该可以工作。
<强>更新强>
查看错误后,您需要通过驱动程序URL将其他变量传递给服务器。
jdbc:postgresql://localhost/test?stringtype=unspecified
or
jdbc:postgresql://localhost/test?user=user&password=pass&stringtype=unspecified
额外的参数stringtype=unspecified
将删除输入字符串的类型检查。