Arrays h2:“;数据转换错误“;在从存储过程返回的数组上

Arrays h2:“;数据转换错误“;在从存储过程返回的数组上,arrays,stored-procedures,h2,Arrays,Stored Procedures,H2,这是一篇后续文章。我正在编写一个由h2数据库支持的会计系统。帐户树存储在accounts表中,父ID列存储树中的链接 要获取树中给定节点的路径,我有以下存储过程: public static Long[] getAncestorPKs(Long id) 其任务是生成一个整数数组,该数组是给定节点和树的根之间的父ID值。让我们想象一下它的定义是这样的(因为我已经尝试过了,并且得到了相同的错误): 它在数据库中正确注册,我可以在SQL查询中调用它。我的问题是h2似乎无法处理返回值:如果我这样使用它

这是一篇后续文章。我正在编写一个由h2数据库支持的会计系统。帐户树存储在accounts表中,父ID列存储树中的链接

要获取树中给定节点的路径,我有以下存储过程:

public static Long[] getAncestorPKs(Long id)
其任务是生成一个整数数组,该数组是给定节点和树的根之间的父ID值。让我们想象一下它的定义是这样的(因为我已经尝试过了,并且得到了相同的错误):

它在数据库中正确注册,我可以在SQL查询中调用它。我的问题是h2似乎无法处理返回值:如果我这样使用它:

SELECT ID FROM ACCOUNTS WHERE ID IN (ANCESTOR_PKS(5))
然后我得到以下错误:

Data conversion error converting "(1, 2, 3)"; SQL statement:
SELECT ID FROM ACCOUNTS WHERE ID IN (ANCESTOR_PKS(5)) [22018-167]
相反,如果我将以下内容发送到数据库:

SELECT ID FROM ACCOUNTS WHERE ID IN (1, 2, 3)
我得到一个包含三行的结果集,其中包含三个整数(正是我所期望的)

我真的看不出这里有什么问题!我返回一个long数组,用于与包含bigint的列进行比较。为什么h2拒绝转换此数组?我已经尝试将返回值设置为Object[],因为h2文档并不完全清楚返回端和调用端是否需要这样做,但这一点没有任何区别。我只是把头撞在砖墙上。这不是火箭科学!肯定有人以前写过类似的代码


在我发疯之前,先谢谢你

如果该方法返回一个对象数组,那么对于数据库,这是一个数据类型的值。而不是一张有3行的桌子。但当然,您不使用表中的数据类型数组,而是使用INT或BIGINT。所以你的查询是不正确的

方法需要返回结果集,或者需要将数组值转换为表。为此,您可以使用以下函数:

select x from table(x bigint = getAncestorPKs(1));
所以你可以做的是:

drop table accounts;
create table accounts(id int);
insert into accounts values(1), (2), (10), (20);
drop alias getAncestorPKs;
create alias getAncestorPKs as 'Long[] getAncestorPKs(Long id) {
  return new Long[]{new Long(1), new Long(2), new Long(3)};
}';
select * from accounts where id in
(select x from table(x bigint = getAncestorPKs(1)));

非常感谢托马斯,这确实解决了问题。但是我想理解为什么我可以在查询中使用数组文字,而不是存储过程返回的数组;它是一个简单值的列表。我能理解为什么这令人困惑。这有点类似于插入到。。。值(x,y,…):在这里,值列表也不是数组。这也是一个简单值的列表。啊,好吧,再次感谢:)因此,我想
从表(…)
表达式也会创建一个值列表,而不是一个结果集(select…中的
既不会在内部创建一个结果集,也不会创建一个值列表。但问题是您的方法返回一个数组值。
drop table accounts;
create table accounts(id int);
insert into accounts values(1), (2), (10), (20);
drop alias getAncestorPKs;
create alias getAncestorPKs as 'Long[] getAncestorPKs(Long id) {
  return new Long[]{new Long(1), new Long(2), new Long(3)};
}';
select * from accounts where id in
(select x from table(x bigint = getAncestorPKs(1)));