将值从 java 传递给 oracle 语句中的命名参数

Passing a value from java to a named parameter in an oracle statement

我正在尝试将字符串数组传递给准备好的语句的命名参数:

声明:

SELECT *
FROM FOOBAR
WHERE HOSTID IN (:hostIds)
ORDER BY NAME;

HOSTID的类型是编号

我要传递的值在我的数据库中保存为字符串,e。例如:“1、3、37”。 我已经尝试了各种方法,但我还不能使它起作用。

第一:按原样传递这个值。 问题:适用于一个值 ('1'),但不适用于多个值,因为 oracle 将其解释为一个值 ('1, 3') -> 1.3 (?)

其二:创建一个集合,建一个java.sql.Array然后传过去。 问题:数据类型不一致 :( 我创建了一个这样的集合:

CREATE OR REPLACE TYPE VARCHAR2_ARRAY IS TABLE OF VARCHAR2;

并尝试构建一个数组并使用

statement.setArrayAtName("hostIds", value);

但这也没有用。

有什么建议吗?

我自己找到了解决方法。我将声明更改为:

SELECT *
FROM FOOBAR
WHERE to_char(HOSTID) IN
      (SELECT trim(regexp_substr(:hostIds, '[^,]+', 1, level))
       FROM dual
       CONNECT BY regexp_substr(:hostIds, '[^,]+', 1, level) IS NOT NULL)
ORDER BY NAME;