java将数组传入函数_java oracle存储过程/函数(1):字符串数组、int数组传入存储过程...

最近CSDN上有比较多的朋友问到java与oracle存储过程/函数的交互方面的问题。本人也是一步步学起来的,在之前也碰到过类似的问题,经常一头雾水。但现在某些东西似乎是有点入门的味道了,觉得应该写点什么总结一下,方便大众,也是为了自己查找方便。就准备写一个系列。

嗯,因为是原创,可能代码存在一些错误或者不足,还希望大家谅解并指出来。但可以负责任的说一句:本人的以下代码都是测试通过的,可以直接^C^V用。好了,废话不多说,直接来第一篇。

oracle的连接类

这个在后续的所有java代码中都会用到,本来不想写的,但懒得每个类中都这么getConnection一下,所以弄了这个。另外,类所在的package也就不改了,请要用的朋友相应的修改吧,后续的各篇也是如此,这里就不过多罗嗦了。

package test.oracle.conn;

import java.sql.Connection;

import java.sql.DriverManager;

public class OConnection {

public static Connection getConn() {

String URL = "jdbc:oracle:thin:@127.0.0.1:1521:ORCL";

String user = "cartoon";// 这里替换成你自已的数据库用户名

String password = "oracle";// 这里替换成你自已的数据库用户密码

Connection connection = null;

try {

Class.forName("oracle.jdbc.driver.OracleDriver");

System.out.println("类实例化成功!");

connection = DriverManager.getConnection(URL, user, password);

System.out.println("创建连接对像成功!");

} catch (Exception err) {

err.printStackTrace();

return null;

}

return connection;

}

}

1varchar2、number数组.sql

--为了保证写出来的都是可以运行的,所以每次创建表、类型等等,都先drop一下。第一次运行的朋友,可能会发现drop语句报×××不存在,可以忽略。引号

drop table T_VarcharArray;

create table T_VarcharArray(

id number(10),

name varchar2(100)

);

drop type T_VARCHAR;

--创建一个与T_VarcharArray的name同类型的不定长数组的引定义

create or replace type T_VARCHAR as table of varchar2(100);

/

drop type T_NUMBER;

--创建一个与T_VarcharArray的id同类型的不定长数组的定义

create or replace type T_NUMBER as table of number(10);

/

create or replace procedure P_VARCHAR2_LST(

i_t_varchar IN t_varchar, --输入参数为定义的不定长varchar2数组

o_n_ret OUT number --输出参数,正常结束,则输出0,否则抛出异常

)

is

begin

FOR i in 1..i_t_varchar.COUNT loop --注意下标从1开始。

insert into T_VarcharArray values (i,i_t_varchar(i));

end loop;

o_n_ret :=0;

exception when others then

raise;

end;

/

create or replace function F_NUMBER_LST(

i_t_number IN t_number --输入参数为定义的不定长数值数组

)

return number --函数输出结果

is

begin

FOR i in 1..i_t_number.COUNT loop --注意下标从1开始。

insert into T_VarcharArray values (i_t_number(i),to_char(i));

end loop;

return 0;

exception when others then

raise;

end;

/

Varchar2NumberArray.java

package test.oracle.oj;

import java.sql.*;

import oracle.jdbc.driver.OracleTypes;

import oracle.sql.ARRAY;

import oracle.sql.ArrayDescriptor;

import test.oracle.conn.OConnection;

public class Varchar2NumberArray {

// 注意:T_VARCHAR2必须全部大写

private static final String T_VARCHAR = "T_VARCHAR";

private static final String T_NUMBER = "T_NUMBER";

// 注意:call必须小写,过程名字必须全部大写

private static final String P_VARCHAR2_LST = "{call P_VARCHAR2_LST(?,?)}";

// 注意:call必须小写,过程名字必须全部大写,返回值在java中是第一个

private static final String F_NUMBER_LST = "{? = call F_NUMBER_LST(?)}";

public static int varchar2LstTest(String[] lst) {

int retVal = -1;

Connection con = null;

CallableStatement cstmt = null;

try {

con = OConnection.getConn();

// 创建一个数组描述符

ArrayDescriptor varchar2Desc = ArrayDescriptor.createDescriptor(

T_VARCHAR, con);

// 将字符串数组转换为oralce能识别的数组

ARRAY vArray = new ARRAY(varchar2Desc, con, lst);

cstmt = con.prepareCall(P_VARCHAR2_LST);

cstmt.setArray(1, vArray);

cstmt.registerOutParameter(2, OracleTypes.INTEGER);

cstmt.execute();

retVal = cstmt.getInt(2);

} catch (Exception ex) {

ex.printStackTrace();

} finally {

// 最好都在finally里面关闭用到的cs、ps、rs以及con,

// 以确保出异常时,该释放的都被释放

try {

if (cstmt != null) {

cstmt.close();

}

if (con != null) {

con.close();

}

} catch (SQLException sqle) {

sqle.printStackTrace();

}

}

return retVal;

}

public static int numberLstTest(int[] lst) {

int retVal = -1;

Connection con = null;

CallableStatement cstmt = null;

try {

con = OConnection.getConn();

// 创建一个数组描述符

ArrayDescriptor varchar2Desc = ArrayDescriptor.createDescriptor(

T_NUMBER, con);

// 将字符串数组转换为oralce能识别的数组

ARRAY vArray = new ARRAY(varchar2Desc, con, lst);

cstmt = con.prepareCall(F_NUMBER_LST);

// 返回值在java中是第一个,所以先注册输出参数

cstmt.registerOutParameter(1, OracleTypes.INTEGER);

cstmt.setArray(2, vArray);

cstmt.execute();

retVal = cstmt.getInt(1);

} catch (Exception ex) {

ex.printStackTrace();

} finally {

// 最好都在finally里面关闭用到的cs、ps、rs以及con,

// 以确保出异常时,该释放的都被释放

try {

if (cstmt != null) {

cstmt.close();

}

if (con != null) {

con.close();

}

} catch (SQLException sqle) {

sqle.printStackTrace();

}

}

return retVal;

}

public static void main(String[] args) throws Exception {

String[] lst = { "test1", "test2", "test2" };

int ret = Varchar2NumberArray.varchar2LstTest(lst);

System.out.println("测试字符串数组作为参数传入存储过程,结果:" + ret);

int[] lst1 = { 1, 2, 3 };

ret = Varchar2NumberArray.numberLstTest(lst1);

System.out.println("测试整型数组作为参数传入存储过程,结果:" + ret);

}

}

第一篇貌似就这么结束了,这里讲的只是如何把String数组、int数组传入oracle并使用,下一节讲如何传出。

喜欢的朋友关注下,记得帮顶噢,合伙哈。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值