注:本文来源于 《  java 实现往oracle存储过程中传递array数组类型的参数  》

最近项目中遇到通过往存储过程传递数组参数的问题, 

浪费了N多个小时,终于有点头绪。 

具体的代码就不写上了,因为项目中存储过程的调用方法全部是封装好的(好像现在都这样,都姓3层,嘿嘿) 

原理:

1.一维数组

A.单纯的一维数组的话,直接建立一个table类型就可以 

  1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);

2.多维数组

A.多维数组就要稍加修改了,如二维数组 

  1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200);
2
3 TYPE TYPE_TABLE AS TABLE OF TYPE_VARCHAR;

3.java代码的实现

A。首先是connection的问题,connection必须是OracleConnection(java.sql包下的) 

B。必须给Array添加一种数据定义(oracle.sql.ArrayDescriptor) 

C。ARRAY必须是java.sql.Array 

D。好了,开始定义ARRAY 

arrDesc
= ArrayDescriptor.createDescriptor("TYPE_TABLE",
getNativeConnection(conn)); 
  ARRAY arr = new ARRAY(arrDesc, getNativeConnection(conn), new
Object[][]{{"test1","test2"},{"testA","testB"}}); 

从网上搜到为数不多的代码(仅供参考) 

下面代码来自ChinaUnix博客(http://blog.chinaunix.net/u2/63586/showart_703439.html) 

  1 -----------------------------------------------------------------------------------
2 import java.sql.Connection;
3 import java.sql.PreparedStatement;
4 import java.sql.CallableStatement;
5 import java.sql.ResultSet;
6 import java.sql.SQLException;
7 import java.sql.Types;
8 import java.util.ArrayList;
9 import oracle.sql.ARRAY;
10 import oracle.sql.ArrayDescriptor;
11 import org.apache.tomcat.dbcp.dbcp.DelegatingConnection;
12 public class BussinessLog {
13 public static ArrayList<Comparable> CancelLog(String sLoginUser, Object[] arrLogID)
14 {
15 ArrayList<Comparable> arrList = new ArrayList<Comparable>();
16 Connection conn = null;
17 CallableStatement callStmt = null;
18 String sql = null;
19 ArrayDescriptor arrDesc = null;
20
21 try
22 {
23 conn = DbConnectionManager.getConnection();
24 sql = "{call P_CanceltLog(?,?,?,?)}";
25 callStmt = conn.prepareCall(sql);
26 arrDesc = ArrayDescriptor.createDescriptor("NUMBERTABLE", getNativeConnection(conn));
27 ARRAY arr = new ARRAY(arrDesc, getNativeConnection(conn), arrLogID);
28 callStmt.setString(1, sLoginUser);
29 callStmt.setObject(2, arr, Types.ARRAY);
30 callStmt.registerOutParameter(3, Types.VARCHAR);
31 callStmt.registerOutParameter(4, Types.INTEGER);
32 callStmt.execute();
33
34 arrList.add(callStmt.getInt(4));
35 arrList.add(callStmt.getString(3));
36 return arrList;
37 } catch (Exception e) {
38 System.out.println(e.toString());
39 } finally {
40 DbAction.clear(conn, callStmt);
41 }
42 return arrList;
43 }
44
45 public static Connection getNativeConnection(Connection con) throws SQLException {
46 if (con instanceof DelegatingConnection) {
47 Connection nativeCon = ((DelegatingConnection) con).getInnermostDelegate();
48 return (nativeCon != null ? nativeCon : con.getMetaData().getConnection());
49 }
50 return con;
51 }
52 }

java 实现往oracle存储过程中传递array数组类型的参数的更多相关文章

  1. Oracle存储过程中异常Exception的捕捉和处理

    Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...

  2. Oracle存储过程中异步调用的实际操作步骤

    本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用  .而有些相关的业务逻辑 ...

  3. ORACLE存储过程中%TYPE和%ROWTYPE的区别

    ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...

  4. Oracle存储过程中跳出循环的写法

    注:本文来源于: <  Oracle存储过程中跳出循环的写法   > Oracle存储过程中跳出循环的写法 记录exit和return的用法 1:exit用来跳出循环 loop IF V_ ...

  5. oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题

    oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题 学习了:http://blog.csdn.net/royzhang7/article/deta ...

  6. oracle存储过程中%type的含义

    转: oracle存储过程中%type的含义 2018-11-07 11:43:56 lizhi_ma 阅读数 1361更多 分类专栏: 数据库   版权声明:本文为博主原创文章,遵循CC 4.0 B ...

  7. 在ORACLE存储过程中创建临时表

    在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...

  8. 了解PHP中的Array数组和foreach

    1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组    . 2.例子:一般的数组 这里,我 ...

  9. PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】

    前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...

随机推荐

  1. Caused by: java.lang.InstantiationException: cn.at.bean.domain.ConstantInt

      org.springframework.jdbc.UncategorizedSQLException: ConnectionCallback; uncategorized SQLException ...

  2. python栈

    class StackEmptyError(Exception): pass class StackFullError(Exception): pass class Stack: def __init ...

  3. python 的基础学习 第九天 文件的操作

    1,文件操作 参数:1,文件路径  2,编码方式,3,执行动作(打开方式),只读,只写,,读写,追加和读写. 1  打开文件,得到文件句柄并赋值给一个变量.2. 通过句柄对文件进行操作.3. 关闭文件 ...

  4. windows 10下sublime text3环境的搭建以及配置python开发环境

    1 - 安装Sublime Text 3 到官网下载对应的版本,如下: OS X (10.7 or later is required) Windows - also available as a p ...

  5. java基础梳理--朝花夕拾(三)

    1.了解面向对象的编程思想以及面向对象的特性: 对象: EveryThing is Object: 万物皆是对象,在程序中,我们可以将类.接口.方法.属性等都认为是对象: 面向对象: 是一种程序设计方 ...

  6. IBM 3650 M3 yum upgrade后系统无法登陆问题

    一.背景 IBM 3650 M3安装了centos7.2操作系统 今天yum upgrade升级centos7.6,重启系统后发现开不了机,报错如下: Failed to set MokListRT: ...

  7. Eclipse同时显示两个编辑窗口

    同时打开两个编辑窗口,点住一个窗口,拖到编辑窗口的最下面时或者最右面,会出现两个两个编辑窗口的轮廓,松开即可!

  8. CF1096E The Top Scorer

    题目地址:洛谷CF1096E 本场AC数最少 (最难) 的题目 题目大意:给出三个数p , s,r,表示有p人,每个人都有一个非负得分,所有人的得分和为s,Hasan的得分至少为r,求Hasan是第一 ...

  9. 关于Jonathan S. Weissman与RIT(罗切斯特理工学院,位于纽约)

    信息来源于:edx平台的 RITx: CYBER501xCybersecurity Fundamentals  课程的介绍(https://courses.edx.org/courses/course ...

  10. Learning Invariant Deep Representation for NIR-VIS Face Recognition

    查找异质图像匹配的过程中,发现几篇某组的论文,都是关于NIR-VIS的识别问题,提到了许多处理异质图像的处理方法,网络结构和idea都很不错,记录其中一篇. 其余两篇: Wasserstein CNN ...