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 }

原文地址:https://www.cnblogs.com/ios9/p/8858210.html

时间: 2024-10-11 12:44:33

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

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

Oracle存储过程中异常的捕捉和处理 CREATE OR REPLACE Procedure Proc_error_process ( v_IN in Varchar2, v_OUT Out Varchar2) AUTHID CURRENT_USER AS --声明异常 some_kinds_of_err EXCEPTION; -- Exception to indicate an error condition v_ErrorCode NUMBER; -- Variable to hold

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

Oracle存储过程中跳出循环的写法 博客分类: oracle Oracle 记录exit和return的用法 exit用来跳出循环 loop IF V_KBP IS NULL THEN           EXIT;    END IF; end loop; return跳出存储过程 loop IF V_KBP IS NULL THEN         return;    END IF; end loop; 跳出loop 一次循环 oracle 11g已提供continue; oracle

Oracle 存储过程中的 =&gt;

oracle实参与形参有两种对应方式1.一种是位置方式,和面向对象语言参数传递类似;2.另外一种是=> 作为形参对应,因为位置对应方法有缺限,比如一个函数有3个参数,但第2个是可以不传(有默认值),这里就没办法位置对应方法,oralce内部一般用此种方法作参数传递. CREATE OR REPLACE PROCEDURE HelloWorld( p_user_name VARCHAR2, p_val1 VARCHAR2 DEFAULT ' Good Moning,', p_val2 VARCHA

oracle 存储过程中使用date 时、分、秒丢失

今天有一开发兄弟找我,说出现一奇怪现象,在存储过程中赋date类型的值,时.分.秒都丢失了,下面来做个试验: SQL> drop table test purge; SQL> create table test ( fill_date  date ); SQL> insert into test values(sysdate); SQL> commit; SQL> select to_char(fill_date,'yyyy-MM-dd HH24:mi:ss') from t

Javascript中的Array(数组) 、{}(映射) 与JSON解析

做网页总会使用javascript,使用javascript总会使用JSON.最近用到一下,就写写. 下面是总结: 1.将javascript中的Array和{}转化为json字符串可以使用json2.js,源码地址https://github.com/douglascrockford/JSON-js. 2.将json字符串转为javascript对象,可以使用javascript自带的eval函数. 3.javascript中可以使用typeof查看变量的类型. 4.要访问json字段,必须是

数据类型总结——Array(数组类型)

原文 简书原文:https://www.jianshu.com/p/1e4425383a65 大纲 前言 1.Array数组类型的相关概念 2.创建数组的基本方式有两种 3.检测某个变量是否是数组的方式 4.数组的遍历:for...in语句 5.数组的常用方法 前言 数据类型是每一种语言都需要掌握的内容,掌握每一种数据类型的使用是掌握这门语言必不可少的.而我也对数据类型写了一系列的博客,其中包含了对某一数据类型的概念的认识和理解以及常使用的方法.以下就是我对Array类型的一些认识和理解,希望能

Oracle 存储过程—为数传递变量

oracle 存储过程的基本语法create or replace procedure proc1( p_para1 varchar2, p_para2 out varchar2, p_para3 in out varchar2 )as v_name varchar2(20); begin v_name := '张三丰'; p_para3 := v_name; dbms_output.put_line('p_para3:'||p_para3); end;注:创建语句:create or repl

在oracle存储过程中创建临时表

在oracle的存储过程中,不能直接使用DDL语句,比如create.alter.drop.truncate等. 那如果我们想在存储过程中建立一张临时表就只能使用动态sql语句了: create or replace procedure pro as str_sql varchar2(100); begin -- 创建临时表 str_sql := 'create global temporary table temp_table ( col1 varchar2(10), col2 number

java hibernate 调用oracle存储过程

1.hibernate 调用存储过程 各种方法 http://www.cnblogs.com/jerryxing/archive/2012/04/28/2475762.html 如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新.存储过程直接在数据库中运行,速度更加快.在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下: create or replace procedure batchUpdateStudent(p_a