为什么在使用VARBINARY字段时,HSQLDB数据库中的类型不匹配导致合并(upstart)失败



数据库引擎: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)

这里,abbyte[]clongdeStringsstmtBatchingPreparedStatementWrapper

调试意味着stmt变量认为语句的参数1和2(ab(的类型是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)

最新更新