最有效的方式传递多个未知数量的参数到SELECT查询的IN子句是什么?

huangapple go评论53阅读模式
英文:

What is the most efficient way to pass multiple unknown number of parameters to the IN clause for a select query?

问题

其中一个主要的要求是不要重复编译查询。因此,我们需要使用一个预编译语句,因为它将被从一个Spring Boot应用程序中调用。

类似于:
select * from table where form_id in (?)

我想用从另一个服务中获取的列表来替换 ?。
我正在使用Oracle JDBC驱动程序。

我尝试使用connection.createArrayOf(..),但这不起作用,会产生不支持的特性错误。

英文:

One of the main requirements is for the query to be not compiled repeatedly. So, we need to use a prepared statement as it will be called from a spring boot application.

something like:
select * from table where form_id in (?)

I want to replace ? with a list that I will get from another service.
I am using Oracle JDBC driver.

I tried using connection.createArrayOf(..) but this doesn't work and give feature not supported error.

答案1

得分: 1

你需要取消封装连接以获得一个 OracleConnection,然后调用 createARRAY,需要传递数组的 SQL 类型,例如 CREATE TYPE STRING_TAB IS TYPE OF VARCHAR2(...),然后传递 "STRING_TAB",在这种情况下,第二个参数将是一个 String[],SQL 语句上的 IN 表达式应该是 "IN(SELECT * FROM TABLE(?))"。
你也可以使用 SYS.ODCIxxx 类型。
你可以使用 stmt.setArray() 来分配参数。

英文:

You have to unwrap your connection to have an OracleConnection and call createARRAY, which requires to pass the SQL type of the array: e.g. CREATE TYPE STRING_TAB IS TYPE OF VARCHAR2(...), then you pass "STRING_TAB", and in that case the second parameter will be a String[], and the IN expression on the SQL statement should be "IN(SELECT * FROM TABLE(?))".
You may also use SYS.ODCIxxx types.
You assign the parameter using stmt.setArray().

huangapple
  • 本文由 发表于 2023年6月25日 23:23:57
  • 转载请务必保留本文链接:https://go.coder-hub.com/76551127.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定