请问Oceanbase如何使用表变量?

当查询语句中in得参数非常多时,性能会下降,oracle可通过表变量得方式提升性能。假设现在有sql
SELECT A.FId “id”, A.FNumber "number"FROM t_ORG_ORG A WHERE A.FId IN (?,?..)
如果in里面的参数非常多时,可以使用表变量的形式,提升性能,那么sql变成了
SELECT A.FId “id”, A.FNumber “number” FROM t_ORG_ORG A
WHERE A.FId IN (SELECT COLUMN_VALUE FROM table(?))
Java在设置参数时可如下设置:
oracle.jdbc.OracleConnection ocon = con.unwrap(oracle.jdbc.OracleConnection.class);
oracle.sql.ArrayDescriptor des = oracle.sql.ArrayDescriptor.createDescriptor(“UDT_INTTABLE”, ocon);
stmt.unwrap(oracle.jdbc.OraclePreparedStatement.class).setARRAY(index, new oracle.sql.ARRAY(des, ocon, params));//params是个数组
而UDT_INTTABLE可通过CREATE OR REPLACE TYPE udt_inttable AS TABLE OF number(19);来创建。

oceanbase也想通过类似方式实现:
1.先创建类型CREATE OR REPLACE TYPE udt_inttable AS TABLE OF number(19);
2.语句为:
SELECT A.FId “id”, A.FNumber “number”
FROM t_ORG_ORG A
WHERE A.FId IN (SELECT COLUMN_VALUE FROM udt_inttable (?))
3.设置参数
OceanBaseConnection oceanBaseConnection = con.unwrap(OceanBaseConnection.class);
Array array = oceanBaseConnection.createArrayOf(“UDT_INTTABLE”,params);//params是个数组
stmt.unwrap(BasePrepareStatement.class).setArray(index,array);
但是却报错Caused by: java.sql.SQLException: ORA-00932: inconsistent datatypes。

请问oceanbase得表变量要如何实现?是否我的java代码设置参数有问题?

ob什么版本呢。企业版还是社区版?

  1. 检查 SQL 查询语句,找出不一致的数据类型,使用 CAST 或 CONVERT 函数将数据类型转换为相同的类型。
  2. 如果插入数据的数据类型与表中列的数据类型不一致时,会报错。可以改为一样的。

另外 ORACLE属于企业版范围内的功能细节。建议你通过以下方式寻求帮助:
1.如你所在的企业客户已签署OceanBase企业版销售合同,请你联系客户经理;
2.如你所在的企业客户尚未签署OceanBase企业版销售合同,你可通过OceanBase官网商务咨询页面留下你的联系方式,OceanBase企业版的业务顾问会在一个工作日内与你联系。
OceanBase官网商务咨询

是企业版本4.2.1.3;字段类型和我们传入的数组的类型是对的上的。

解决办法:已建议用户使用临时表绕过了。

1 个赞