java 实现往oracle存储过程中传递array数组类型的参数
注:本文来源于 《 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数组类型的参数的更多相关文章
- Oracle存储过程中异常Exception的捕捉和处理
Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Var ...
- Oracle存储过程中异步调用的实际操作步骤
本文标签:Oracle存储过程 我们都知道在Oracle数据库的实际应用的过程中,我们经常把相关的业务处理逻辑,放在Oracle存储过程中,客户端以通过ADO来进行相关的调用 .而有些相关的业务逻辑 ...
- ORACLE存储过程中%TYPE和%ROWTYPE的区别
ORACLE存储过程中%TYPE和%ROWTYPE的区别 在存储过程中%TYPE和%ROWTYPE常用来在PL/SQL中定义变量 因为 t_emp emp%rowtype ;这个语句的意思是 定义一个 ...
- Oracle存储过程中跳出循环的写法
注:本文来源于: < Oracle存储过程中跳出循环的写法 > Oracle存储过程中跳出循环的写法 记录exit和return的用法 1:exit用来跳出循环 loop IF V_ ...
- oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题
oracle存储过程中使用execute immediate执行sql报ora-01031权限不足的问题 学习了:http://blog.csdn.net/royzhang7/article/deta ...
- oracle存储过程中%type的含义
转: oracle存储过程中%type的含义 2018-11-07 11:43:56 lizhi_ma 阅读数 1361更多 分类专栏: 数据库 版权声明:本文为博主原创文章,遵循CC 4.0 B ...
- 在ORACLE存储过程中创建临时表
在ORACLE存储过程中创建临时表 存储过程里不能直接使用DDL语句,所以只能使用动态SQL语句来执行 --ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截 ...
- 了解PHP中的Array数组和foreach
1. 了解数组 PHP 中的数组实际上是一个有序映射.映射是一种把 values 关联到 keys 的类型.详细的解释可参见:PHP.net中的Array数组 . 2.例子:一般的数组 这里,我 ...
- PostgreSQL Array 数组类型与 FreeSql 打出一套【组合拳】
前言 PostgreSQL 是世界公认的功能最强大的开源数据库,除了基础数据类型 int4/int8/varchar/numeric/timestamp 等数据类型,还支持 int4[]/int8[] ...
随机推荐
- luogu 1268 树的重量
打眼一看就是最小生成树嘛,但经过板子wa掉的经历后得知,,emmmm,原来是, 构造! (虽然不知是什么但觉得听起来很厉害的样子...手动微笑) n=2的情况 自然就是g(1,2) n=3的情况,由于 ...
- system("x")
system("pause");和system("cls")使用示例程序 #include "stdio.h" #include " ...
- vscode隐藏运行ts生成的js文件和map文件
在code-首选项-用户设置中放入以下代码,覆盖原有的 { "files.exclude": { "node_modules": true, "**/ ...
- vue之简单的todoList(一)
<!-- 根组件 --> <!-- vue的模板内,所有内容要被一个根节点包含起来 --> <template> <div id="app" ...
- python之import模块及包的调用
模块概念 在Python中,一个.py文件就称之为一个模块(Module).使用模块组织代码,最大的好处是大大提高了代码的可维护性 模块一共三种:python标准库.第三方模块.应用程序自定义模块. ...
- mysql 原理 ~ redo
一 简介:redo log二 文件 ib_logfile0 ib_logfile1 两个redo log 默认为一组 循环覆盖写入三 相关参数 innodb_log_file_size=256 ...
- IndexedDB API
参考链接:https://wangdoc.com/javascript/bom/indexeddb.html
- 贝叶斯优化(Bayesian Optimization)深入理解
目前在研究Automated Machine Learning,其中有一个子领域是实现网络超参数自动化搜索,而常见的搜索方法有Grid Search.Random Search以及贝叶斯优化搜索.前两 ...
- 20165325 2017-2018-2 《Java程序设计》结对编程_第二周:四则运算
20165325 2017-2018-2 <Java程序设计>结对编程_第二周:四则运算 一.码云链接 FAO项目的码云链接; 1.Git提交日志已经实现一个功能/一个bug修复的注释说明 ...
- sort+uniq
cat a b | sort | uniq > c # c 是a和b的合集 cat a b | sort | uniq -d > c # c 是a和b的交集 cat a b b | sor ...