`

执行数组参数的存储过程

阅读更多

今天在做移植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讨论后,他也没办法,而且他也早就这样做过了,哈哈

分享到:
评论

相关推荐

    sqlserver的存储过程与 where in 多值参数

    在SQL Server中,存储过程是预编译的SQL语句集合,它们封装了特定的数据库操作,提高了代码的重用性和执行效率。当涉及到处理多个值时,我们常常会遇到如何将这些值作为参数传递给存储过程的问题。本文将探讨在SQL ...

    MySQL存储过程学习

    存储过程是一组为了完成特定功能的SQL语句集合,这些语句被存储在数据库中,可以由用户或者应用程序按需调用执行。相比于单条SQL语句,存储过程有以下优点:提高性能(因为编译只需要一次)、减少网络流量(因为只需...

    SQL SERVER 存储过程学习笔记

    在SQL Server中,存储过程是一种预编译的SQL语句集合,它允许开发人员封装一组数据库操作,并在需要时重复调用。存储过程是数据库管理中的一个重要概念,它提供了提高性能、安全性和代码重用的可能性。这篇学习笔记...

    SQL存储过程创建与调用

    - **带参数存储过程**:接收输入参数,可能有输出参数。 - **带有结果集的存储过程**:可以返回一个或多个结果集,类似于SELECT查询。 5. **存储过程的修改与删除** 使用`ALTER PROCEDURE`可修改已存在的存储...

    MySQL存储过程学习资料

    MySQL存储过程是数据库管理系统中的一种重要功能,它允许开发者预定义一组SQL语句,并将其封装成一个可重复使用的单元。这个单元可以包含多种SQL操作,如SELECT、INSERT、UPDATE、DELETE等,以及流程控制语句,如IF-...

    DB2存储过程培训200908

    DB2存储过程是数据库管理系统DB2中的一个重要特性,它允许用户编写包含一组SQL语句的程序,这些程序可以在需要时执行,以完成特定的数据处理任务。在“DB2存储过程培训200908”这份资料中,你将深入学习如何有效地...

    mysql存储例程、存储过程、存储函数进阶学习

    1. **存储过程**:存储过程是一组为了完成特定功能的SQL语句集合,预编译存储在数据库中,可以按名称调用执行。存储过程的主要优点包括减少网络流量,提高执行速度,增强安全性,以及提供模块化编程。通过参数化调用...

    常用存储过程集锦

    这个存储过程接受查询SQL、当前页码和每页记录数作为参数,通过`sp_cursoropen`、`sp_cursorfetch`和`sp_cursorclose`系统存储过程来执行分页查询,并计算总记录数和总页数。`set nocount on`用于关闭行计数,提高...

    SQL存储过程实例.doc

    SQL存储过程是数据库管理系统中一组为了完成特定功能的SQL语句集,它可以被命名并保存,然后在需要的时候调用,极大地提高了SQL代码的重用性和执行效率。在这个实例中,我们看到一个名为`Sum_wage`的存储过程,它的...

    完美翻页存储过程实例

    "存储过程"是数据库系统中的一个重要概念,它是一组预先编译好的SQL语句集合,可以在需要时被调用执行。在本实例中,“完美翻页存储过程”可能涉及到了如何在海量数据中实现快速、平滑的分页查询,同时考虑了性能和...

    Oracle通用数据库存储过程代码--高效分页存储过程

    - **存储过程**:在数据库中预先定义并编译好的一组SQL语句,可以接受输入参数,执行复杂的逻辑操作,并返回结果。 - **分页**:指将查询结果按照一定的数量划分成多个页面显示的技术。 #### 存储过程内容解析 ###...

    oracle存储过程使用文档

    - **定义**:存储过程(Stored Procedure)是在数据库中预编译的一组SQL语句集合,它可以被当作一个单独的对象来调用,只需要指定存储过程的名字及参数(如果有的话)。在Oracle中,存储过程是一个重要的数据库对象...

    SQL翻页功能的存储过程

    存储过程是数据库中一组预编译的SQL语句,它可以有输入、输出参数,也可以返回值。当需要多次执行相同的SQL操作时,使用存储过程可以提高性能,因为数据库只需在首次调用时编译该过程,后续调用直接执行已编译的版本...

    存储过程与事务

    此函数接收存储过程名称和参数数组,执行存储过程,并返回一个包含结果集的`DataSet`对象。 #### 二、事务处理 事务处理确保了数据库操作的原子性、一致性、隔离性和持久性(ACID特性)。在C#中,可以使用`...

    mysql存储过程之返回多个值的方法示例

    MySQL存储过程是数据库中用于执行复杂操作的一组预编译的SQL语句,它们可以接收输入参数、输出结果以及在内部处理数据。在本示例中,我们将探讨如何通过存储过程返回多个值,并且结合PHP进行调用。 首先,我们要...

    实验六 游标、存储过程与触发器

    2. **存储过程**:存储过程是一组预编译的SQL语句,可以视为数据库中的函数,执行特定任务。实验中创建了两个存储过程。第一个存储过程`student_xx`接受学生姓名作为输入参数,查询该学生所修课程的课程号和课程名。...

    oracle存储过程学习经典[语法+实例+调用]

    存储过程是一组为了完成特定功能的SQL语句集,这些语句被编译并存储在数据库中,用户可以通过调用存储过程的名字来执行这些预编译的SQL操作,而不是每次都重新编写相同的SQL语句。这种方式提高了代码的效率和可维护...

    plsql之存储过程 数据库

    创建无参数存储过程,如示例中的`pro_1`,通过`CREATE OR REPLACE PROCEDURE`语句定义,然后在SQL*Plus中使用`EXEC`命令执行,或者通过JDBC的`CallableStatement`调用。 4. **带有IN类型参数的存储过程** 如示例...

    mysql存储过程实现分页

    存储过程可以在服务器端执行,从而提高性能和安全性。通过存储过程实现分页功能,可以极大地简化前端代码,并使数据库操作更加灵活高效。 #### 存储过程实现分页 根据题目提供的信息,下面将详细介绍如何使用MySQL...

Global site tag (gtag.js) - Google Analytics