英文:
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().
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论