注:本文来源于 《  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. 关于MySQL常用的查询语句

    一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,= ...

  2. SaltStack 理解

    一.SaltStack 原理: 1.SaltStack 也是基于CS模式的主控master和client被控端 minion 结构:也是一个异构平台基础设置管理工具:遵守Apache2协议,完全开源. ...

  3. Flume思维导图

  4. myeclipse svn JavaHL(JNT) 不能使用的问题?

    分析:根据官方文档描述,64位的myeclipse 需要安装一个Subversion文件,否则会出现 not JavaHL(JNT),需要安装才能使用svn. 解决方案1:安装一个Setup-Subv ...

  5. HeapByteBuffer与DirectByteBuffer

    HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...

  6. POJ 1458 Common Subsequence 最长公共子序列

    题目大意:求两个字符串的最长公共子序列 题目思路:dp[i][j] 表示第一个字符串前i位 和 第二个字符串前j位的最长公共子序列 #include<stdio.h> #include&l ...

  7. 2017-2018-2 20165237 实验二《Java面向对象程序设计》实验报告

    ##2017-2018-2 20165237 实验二<Java面向对象程序设计>实验报告 No.1 实验要求: 实验三 敏捷开发与XP实践 http://www.cnblogs.com/r ...

  8. 通过SecureCRT连接虚拟机

    继续上一篇: http://www.cnblogs.com/CoolJayson/p/7430421.html 上一篇配置了虚拟机网络环境, 实际开发中通常使用SecureCRT或Xshell等连接L ...

  9. Windows中Anaconda,Tensorflow 和 Pycharm的安装和配置

    Anaconda完全入门指南 https://www.jianshu.com/p/eaee1fadc1e9                 [安装不要按此条链接进行] Windows中 Anacond ...

  10. [Harbor]Docker登录Harbor仓库(HTTP方式)

    Docker登录到Harbor仓库时,不管是使用http协议还是使用https协议,都需要修改一些配置. 这篇文章来介绍一下,在使用http协议时,需要进行什么哪些配置. 首先,确定自己的Harbor ...