数据库引擎:HSQLDB(因为它允许Java中的嵌入式应用程序DB(
语言:Java 8(实际上是Groovy 3.0.2,但它基本上是JRE(
架构如下:
CREATE TABLE A (
START VARBINARY(16) NOT NULL,
END VARBINARY(16) NOT NULL,
ID BIGINT NOT NULL,
COUNTRY VARCHAR(8),
DESCRIPTION VARCHAR(256),
PRIMARY KEY (START, END)
);
START和END是编码为4或16元素字节数组的IPv4或IPv6地址。
我在这段代码中得到一个错误"org.hsqldb.HsqlException:转换中不兼容的数据类型"(简化(:
stmt.addBatch(a, b, c, d, e)
当使用此"upstart"插入表中不存在的数据时:
MERGE INTO A
USING (VALUES ?,?,?,?,?) I (START, END, ID, COUNTRY, DESCRIPTION)
ON (A.START = I.START AND A.END = I.END)
WHEN MATCHED THEN UPDATE
SET A.ID = I.ID, A.COUNTRY = I.COUNTRY, A.DESCRIPTION = I.DESCRIPTION
WHEN NOT MATCHED THEN INSERT (START, END, ID, COUNTRY, DESCRIPTION)
VALUES (I.START, I.END, I.ID, I.COUNTRY, I.DESCRIPTION)
这里,a
和b
是byte[]
,c
是long
,d
和e
是Strings
,stmt
是BatchingPreparedStatementWrapper
。
调试意味着stmt
变量认为语句的参数1和2(a
和b
(的类型是VARCHAR。。。它们应该是VARBINARY(16(。
事实上,它似乎认为所有的参数都是VARCHAR。这似乎很奇怪。
我不认为我的SQL有任何明显的问题,因为当我将START和END字段定义为VARCHARs时,它曾经工作过。现在他们不是VARBINARY。
(我想要VARBINARIES的原因是允许在VARBINARY值之间进行数字风格的比较。(
我的谷歌搜索没有发现任何相关内容,但也许这里有人能提供线索?
显式cast()
查询中的输入参数是否有效?
MERGE INTO A
USING
(VALUES CAST(? AS VARBINARY(16)), CAST(? AS VARBINARY(16)), ?, ?, ?)
I (START, END, ID, COUNTRY, DESCRIPTION)
ON (A.START = I.START AND A.END = I.END)
WHEN MATCHED
THEN UPDATE
SET A.ID = I.ID, A.COUNTRY = I.COUNTRY, A.DESCRIPTION = I.DESCRIPTION
WHEN NOT MATCHED
THEN INSERT (START, END, ID, COUNTRY, DESCRIPTION)
VALUES (I.START, I.END, I.ID, I.COUNTRY, I.DESCRIPTION)