【发布时间】:2020-08-25 03:26:58
【问题描述】:
我一直在尝试使用 Java 和 PreparStatement 在 Postgres 中保存一个 JSON 数组半个永恒。
我在 Postgres 中使用自己的类型。
不幸的是,我总是收到类型错误消息
这是我的 Postgres 函数,用于将数据插入到我的表中:
CREATE OR REPLACE FUNCTION "Portfolio"."Einfuegen"(
"dokumenteIN" "Portfolio".t_dokumente[],
"finanzenIN" numeric[],
"bildIN" bytea)
RETURNS character varying
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
BEGIN
INSERT INTO "Portfolio"."Historie" (dokumente,finanzen,bild) VALUES
("dokumenteIN","finanzenIN","bildIN");
return 'Gesichert';
END;
$BODY$;
我的自定义类型如下所示:
CREATE TYPE "Portfolio".t_dokumente AS
(
inhalt json[]
);
ALTER TYPE "Portfolio".t_dokumente
OWNER TO postgres;
我正在尝试使用 Java 插入一些 JSON 数组数据:
for (int i = 0; i < arrayDokus.length(); ++i) {
JSONObject rec = arrayDokus.getJSONObject(i);
String nameBild = rec.getString("Name");
String inhalt = rec.getString("Inhalt");
byte[] in = inhalt.getBytes();
try {
Blob blob = new SerialBlob(in);
JSONObject neuesObjekt = new JSONObject();
neuesObjekt.append("Name", nameBild);
neuesObjekt.append("Inhalt", blob);
where.add(neuesObjekt);
} catch (SerialException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
PGobject jsonObject = new PGobject();
jsonObject.setType("json[]");
jsonObject.setValue(where.toString());
PreparedStatement stmt = con.prepareStatement("SELECT * FROM \"Portfolio\".\"Einfuegen\"
(?::\"Portfolio\".t_dokumente[],?,?)");
stmt.setObject(1, jsonObject);
stmt.setArray(2, f);
stmt.setBinaryStream(3,in);
ResultSet rs = stmt.executeQuery();
con.commit();
[...]
但我得到了错误:
org.postgresql.util.PSQLException:错误:无法将类型 json [] 转换为类型“Portfolio”.t_dokumente []
【问题讨论】:
-
与你的问题无关,但是:你真的应该避免那些可怕的引用标识符。他们的麻烦比他们的价值要多得多。 wiki.postgresql.org/wiki/…
-
你的数据结构很奇怪,列
dokumente是一个complex数组,每个complex都有一个字段inhalt——一个json数组,为什么不直接使用JSONB呢?跨度>
标签: postgresql