我需要使用只读访问通过JDBC从Oracle 19 c Enterprise Edition查询数据。我正在使用Quarkus(https://quarkus.io)和AgroalDataSource(以下为ds)。
我有一个如下的代码(为了可读性,省略了try/catch):
var oSql = "SELECT * FROM example WHERE tag in (?)";
var connection = ds.getConnection();
var oracleCon = connection.unwrap(OracleConnection.class);
var prepStmt = connection.preparedStatement(oSql);
// here I would like to set the ? to a list and I found createOracleArray, but it needs a first parameter. How do I create it?
var arr = oracleCon.createOracleArray("???", new String[] {"tag1", "tag2"});
prepStmt.setArray(1, arr);
1条答案
按热度按时间gdrx4gfi1#
Oracle的SQL支持两种形式的IN运算符
IN (1, 2, 3, :4)
。这些值是标量,可以是常量或绑定变量,它们的数量必须在执行SQL之前定义/已知。IN (select single_column from ...)
中。在本例中,有一个子查询返回游标。这两个选项都不直接适用于您。如果你运气好并且JDBC驱动程序支持它,你可以使用
TABLE()
操作符将集合转换为内存表:TABLE
操作符将集合转换为表,子查询将返回游标。看这个example:
更新:@gouessej,我确实检查了Metalink笔记(文档ID 2563257.1)和(文档ID 1364193.1),现在看起来Oracle JDBC将不支持Connection. createArrayOf。
注意:Oracle不支持匿名数组类型,因此不支持标准的Connection.createArrayOf方法。
我认为原因是PL/SQL受到ADA的启发,而ADA是强类型语言。Oracle没有String数组的泛型类型,用户必须为每次使用非标量类型创建一个命名类型。