java - 使用表类型调用过程。创建结构时出现异常:java.lang.AbstractMethodError:oracle.jdbc.driver.T4CConnection.createStruct
问题描述
我尝试创建 Struct 元素数组以将其传递给 Oracle 过程。当我尝试设置数组的第一个元素时,我收到一个异常:
java.lang.AbstractMethodError:oracle.jdbc.driver.T4CConnection.createStruct
可能是什么原因以及如何纠正这个问题?我的例子:
import java.sql.Array;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Struct;
public class TypesApp {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.OracleDriver");
Connection connection =
DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.20:1521:dw", "user", "password");
final String typeName = "T_DEMO_OBJECT";
final String typeTableName = "T_DEMO_OBJECTS";
Struct[] structs = new Struct[2];
//Here I get the Exception
structs[0] = connection.createStruct(typeName, new Object[]{23, "Testobject 1"});
structs[1] = connection.createStruct(typeName, new Object[]{40, "Testobject 2"});
CallableStatement callableStatement = connection.prepareCall("{call p_receive_demo_objects(?)}");
Array dataArray = connection.createArrayOf(typeTableName, structs);
callableStatement.setArray(1, dataArray);
callableStatement.executeUpdate();
}
}
我以前版本的相同操作有效(使用 ojdbc6),但是它将数字正确保存到数据库但所有字符串都是空的,所以我尝试找到另一种方法。以前的版本:
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
import oracle.sql.STRUCT;
import oracle.sql.StructDescriptor;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Types;
public class InitMethod2 {
public static void main(String[] args) throws Exception {
Class.forName("oracle.jdbc.OracleDriver");
Connection connection =
DriverManager.getConnection("jdbc:oracle:thin:@10.0.0.20:1521:dw", "user", "password");
final String typeName = "T_DEMO_OBJECT";
final String typeTableName = "T_DEMO_OBJECTS";
final StructDescriptor structDescriptor = StructDescriptor.createDescriptor(typeName.toUpperCase(), connection);
final ArrayDescriptor arrayDescriptor =
ArrayDescriptor.createDescriptor(typeTableName.toUpperCase(), connection);
final ARRAY demoObjectsFromJava = new ARRAY(arrayDescriptor, connection, new STRUCT[]{
// STRUCTS are created with the struct descriptor and a generic object array containing the values of the
// attributes of the T_DEMO_OBJECT
new STRUCT(structDescriptor, connection, new Object[]{23123, "Testobject 1"}),
new STRUCT(structDescriptor, connection, new Object[]{42123, "Testobject 2"})});
CallableStatement cs = connection.prepareCall("{call p_receive_demo_objects(?)}");
cs.setObject(1, demoObjectsFromJava, Types.ARRAY);
cs.execute();
cs.close();
connection.close();
}
}
解决方案
这是由于ojdbc14.jar。当我将其更改为ojdbc6 (11.2.0.3)时,异常消失了。但是在这种情况下,您应该将方法 createArrayOf() 更改为此:
import oracle.jdbc.OracleConnection;
Array dataArray = ((OracleConnection)connection).createOracleArray(typeTableName, structs);
推荐阅读
- windows - 如何将 void 指针传递给 Golang 中的 Windows DLL (void**)
- python - 在 pandas DataFrame 的每一行上训练 IsolationForest 是否有更快的方法?
- c - CS50 Pset 2- 凯撒密码
- windows - 如何使用 wix 在 MSI 安装程序的欢迎消息中添加对齐的自定义消息
- javascript - 只想使用下面的代码显示时间
- git - 如何在命令行中从 git status 中选择第一个元素?
- r - 红绿灯配色方案或调色板
- kubernetes - 您可以强制 GKE 节点自动缩放吗?自动缩放需要多长时间?
- oracle-apex - 文件浏览项目上传到 BLOB 列
- arrays - TypeError:elements.map 不是函数,即使元素是数组?