今天在做移植java项目到云平台的工作,遇到了执行数组参数的存储过程的问题。先介绍一下怎么样执行数组参数的存储过程。
//创建descriptor,typeArrayName是数据库中数组变量的名称
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor(typeArrayName, conn);
//将descriptor和valueObject mapping形成一个Array对象
ARRAY array = new ARRAY(descriptor, oracleConn, valueObject);
//callTest是CallableStatement对象,调用setObject方法设置参数
callTest.setObject(1, (Object) array);
callTest.execute();
问题的原因是ArrayDescriptor.createDescriptor方法中将conn会转换成oracle.jdbc.OracleConnection对象.
但是Cloud平台返回的conn是内部封装好的GenPooledConnection对象。通过反编译发现GenPooledConnection对象继承了Connection对象。但是转成oracle.jdbc.OracleConnection对象时就会抛出类型不匹配的错误。并且在new GenPooledConnection对象的时候,将Connection对象传进来并保存到变量c中,因为c是私有成员变量。接下来通过反射拿到c。
public class GenPooledConnection
/* */ implements Connection, GenCacheable
/* */ {
private Connection c;
/* */ protected GenPooledConnection(String name, Connection c, Stack free, Hashtable active, long timeOut, boolean trace)
/* */ {
/* 36 */ this.id = new Integer(nextId++);
/* 37 */ this.name = name;
/* 38 */ this.c = c;
/* 39 */ this.free = free;
/* 40 */ this.active = active;
/* 41 */ this.timeOut = timeOut;
/* 42 */ this.trace = trace;
/* 43 */ this.starttime = System.currentTimeMillis();
/* 44 */ touch();
/* */ }
。。。
}
public Connection getOracleConnection(Connection conn) throws SWTException
{
Class<?> clazz;
Connection c = null;
try
{
clazz = Class.forName("com.ssc.faw.util.GenPooledConnection");
Field field = clazz.getDeclaredField("c");
field.setAccessible(true);
c = (Connection) field.get(conn);
}
catch (Exception ex)
{
Logger.error("Error Cause::" + ex.getMessage());
throw new SWTException(ex);
}
return c;
}
其实通过反射去拿私有函数也是没办法的事,谁让不提供公有的方法去获得connection对象呢,和TL讨论后,他也没办法,而且他也早就这样做过了,哈哈
分享到:
相关推荐
在SQL Server中,存储过程是预编译的SQL语句集合,它们封装了特定的数据库操作,提高了代码的重用性和执行效率。当涉及到处理多个值时,我们常常会遇到如何将这些值作为参数传递给存储过程的问题。本文将探讨在SQL ...
存储过程是一组为了完成特定功能的SQL语句集合,这些语句被存储在数据库中,可以由用户或者应用程序按需调用执行。相比于单条SQL语句,存储过程有以下优点:提高性能(因为编译只需要一次)、减少网络流量(因为只需...
在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组数据库操作,并在需要时重复调用。存储过程是数据库管理中的一个重要概念,它提供了提高性能、安全性和代码重用的可能性。这篇学习笔记...
- **带参数存储过程**:接收输入参数,可能有输出参数。 - **带有结果集的存储过程**:可以返回一个或多个结果集,类似于SELECT查询。 5. **存储过程的修改与删除** 使用`ALTER PROCEDURE`可修改已存在的存储...
MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,并将其封装成一个可重复使用的单元。这个单元可以包含多种SQL操作,如SELECT、INSERT、UPDATE、DELETE等,以及流程控制语句,如IF-...
DB2存储过程是数据库管理系统DB2中的一个重要特性,它允许用户编写包含一组SQL语句的程序,这些程序可以在需要时执行,以完成特定的数据处理任务。在“DB2存储过程培训200908”这份资料中,你将深入学习如何有效地...
1. **存储过程**:存储过程是一组为了完成特定功能的SQL语句集合,预编译存储在数据库中,可以按名称调用执行。存储过程的主要优点包括减少网络流量,提高执行速度,增强安全性,以及提供模块化编程。通过参数化调用...
这个存储过程接受查询SQL、当前页码和每页记录数作为参数,通过`sp_cursoropen`、`sp_cursorfetch`和`sp_cursorclose`系统存储过程来执行分页查询,并计算总记录数和总页数。`set nocount on`用于关闭行计数,提高...
SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...
"存储过程"是数据库系统中的一个重要概念,它是一组预先编译好的SQL语句集合,可以在需要时被调用执行。在本实例中,“完美翻页存储过程”可能涉及到了如何在海量数据中实现快速、平滑的分页查询,同时考虑了性能和...
- **存储过程**:在数据库中预先定义并编译好的一组SQL语句,可以接受输入参数,执行复杂的逻辑操作,并返回结果。 - **分页**:指将查询结果按照一定的数量划分成多个页面显示的技术。 #### 存储过程内容解析 ###...
- **定义**:存储过程(Stored Procedure)是在数据库中预编译的一组SQL语句集合,它可以被当作一个单独的对象来调用,只需要指定存储过程的名字及参数(如果有的话)。在Oracle中,存储过程是一个重要的数据库对象...
存储过程是数据库中一组预编译的SQL语句,它可以有输入、输出参数,也可以返回值。当需要多次执行相同的SQL操作时,使用存储过程可以提高性能,因为数据库只需在首次调用时编译该过程,后续调用直接执行已编译的版本...
MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...
此函数接收存储过程名称和参数数组,执行存储过程,并返回一个包含结果集的`DataSet`对象。 #### 二、事务处理 事务处理确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。在C#中,可以使用`...
2. **存储过程**:存储过程是一组预编译的SQL语句,可以视为数据库中的函数,执行特定任务。实验中创建了两个存储过程。第一个存储过程`student_xx`接受学生姓名作为输入参数,查询该学生所修课程的课程号和课程名。...
存储过程是一组为了完成特定功能的SQL语句集,这些语句被编译并存储在数据库中,用户可以通过调用存储过程的名字来执行这些预编译的SQL操作,而不是每次都重新编写相同的SQL语句。这种方式提高了代码的效率和可维护...
创建无参数存储过程,如示例中的`pro_1`,通过`CREATE OR REPLACE PROCEDURE`语句定义,然后在SQL*Plus中使用`EXEC`命令执行,或者通过JDBC的`CallableStatement`调用。 4. **带有IN类型参数的存储过程** 如示例...
存储过程可以在服务器端执行,从而提高性能和安全性。通过存储过程实现分页功能,可以极大地简化前端代码,并使数据库操作更加灵活高效。 #### 存储过程实现分页 根据题目提供的信息,下面将详细介绍如何使用MySQL...