存储过程返回一个数组;如何在 SQL 中使用?

Posted

技术标签:

【中文标题】存储过程返回一个数组;如何在 SQL 中使用?【英文标题】:Stored procedure returns an array; how to use in SQL? 【发布时间】:2012-07-25 20:40:30 【问题描述】:

我正在编写一个由 h2 数据库支持的会计系统。帐户树存储在 ACCOUNTS 表中,PARENT_ID 列存储树中的链接。

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

public static Object[] getAncestorPKs(Long id)

其工作是产生一个整数数组,即给定节点和树根之间的 PARENT_ID 值。我在数据库中以 ANCESTOR_PKS 的名称注册该过程,如下所示:

CREATE ALIAS IF NOT EXISTS ANCESTOR_PKS FOR "xxx.yyy.zzz.getAncestorPKs"

我的问题是我似乎找不到在不触发 SQLException 的情况下使用该东西的方法!我需要通过以下方式使用它:

SELECT ID FROM ACCOUNTS WHERE [...] AND ID IN ANCESTOR_PKS(5) [for example]

我收到以下错误:

Syntax error in SQL statement "SELECT ID FROM ACCOUNTS WHERE ID IN ANCESTOR_PKS[*](5) "; expected "("

但是在 ANCESTOR_PKS 之后有一个括号 !!!这到底是怎么回事?有没有办法将 IN 与存储过程的结果一起使用?我已经搜索和搜索,但是我看到的所有使用 IN 的示例都是文字数组,似乎没有人想到展示如何使用作为返回值的数组一个存储过程。

帮忙???

【问题讨论】:

SELECT ANCESTOR_PKS(5) 返回什么? (或者只是选择存储过程的东西) 它返回一个包含一行的结果集,其中包含org.h2.value.ValueArray 类型的对象,其中包含 (x, y, z) 其中 x, y, z 是节点 5 和节点之间的路径中的节点根,即正是所需的结果。 【参考方案1】:

我对 h2 不熟悉,但 this page 说你必须在数组周围放置 ()。

SELECT ID FROM ACCOUNTS WHERE ID IN (ANCESTOR_PKS(5))

也许你甚至必须添加一个子选择

SELECT ID FROM ACCOUNTS WHERE ID IN (SELECT ANCESTOR_PKS(5))

【讨论】:

哇,我确定我已经尝试过了,但我想没有,因为当我今天尝试时,我不再收到错误...但是,我又收到了一个错误!现在我收到Data conversion error converting "(x, y, z)" 有人可以指出我解决this 问题的正确方向吗?非常感谢你让我解决了最初的问题......我真的开始扯头发了! 顺便说一句:我的 Java 方法必须声明为返回 Object[](参见 here,函数数据类型映射部分),但返回值实际上包含 Longs。 @user1547739 嗯...这是整个错误消息吗?我认为你应该关闭这个问题(点击答案左边的钩子)并开始一个新的问题,因为没有人(除了我自己)还会在这里阅读这个 cmets 来回答它。

以上是关于存储过程返回一个数组;如何在 SQL 中使用?的主要内容,如果未能解决你的问题,请参考以下文章

关于SQLserver 存储过程 如何切割一个字符串 转化为数组

查询 SQL 表并将结果存储在数组中

如何在sql server的另一个存储过程中执行存储过程

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

SQL SERVER里面如何在存储过程里面获取另一个存储过程所返回的表的数据?

如何使用输入参数创建 PL/SQL 存储过程以返回数据集