数据库部分:
为了保证写出来的都是可以运行的,所以每次创建表、类型等等,都先drop一下。第一次运行的朋友,可能会发现drop语句报×××不存在,可以忽略。引号
drop table T_VarcharArray;
create table T_VarcharArray(
id number(10),
name varchar2(100)
);
--创建一个与T_VarcharArray的name同类型的不定长数组的引定义
drop type T_VARCHAR;
create or replace type T_VARCHAR as table of varchar2(100);
--创建一个与T_VarcharArray的id同类型的不定长数组的定义
drop type T_NUMBER;
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;
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);
}
}
如果无法将数组中数据插入到数据库中,则将oracle的nls_charset12.jar加入到工程,重新编译即可!
分享到:
相关推荐
最后,对于错误处理,Java端可以捕获`LastErrorException`来获取调用过程中的错误信息。C++端的错误处理则依赖于你的库设计,通常通过返回值或设置全局错误变量。 总之,JNA提供了灵活的方式让Java与C++库进行交互...
当我们谈论`Spring`访问传入数组参数的`Oracle`存储过程时,我们实际上是在探讨如何利用Java的Spring框架与Oracle数据库进行高级交互。Spring是一个广泛使用的开源框架,它简化了企业级Java应用的开发,而Oracle...
Java调用Oracle存储过程返回结果集Record、Cursor参照 Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中...
在Java编程中,调用Oracle数据库的存储过程和函数是常见的任务,这通常涉及到JDBC(Java Database Connectivity)API的使用。以下将详细介绍这个过程,包括必要的步骤、使用的类和方法,以及可能遇到的问题和解决...
### Java将一个二维数组存到TXT文件里,然后再读取 在Java编程中,经常会遇到需要将数据存储到文件中的需求。例如,在本例中,我们需要将一个二维数组中的数据写入到TXT文件中,然后再次从该TXT文件中读取这些数据...
本文将详细讲解如何在C#中使用自定义列表(List)作为参数调用Oracle存储过程,以及实现这一功能的关键技术和注意事项。 首先,我们需要了解Oracle数据库中的PL/SQL类型,例如VARCAR2、NUMBER等,它们对应于C#中的...
在Oracle中,它们都存储在数据库中,可被多次调用,提高了代码复用性和执行效率。 在Hibernate中,调用存储过程通常通过Session对象的createNativeQuery()方法实现,这个方法用于创建原生SQL查询,可以方便地调用...
- **`StoredQueryInfo`**:该类封装了存储过程的元信息,如名称、参数等,方便在调用过程中使用。 - **`RowMapper`**:这是Apache Commons DBUtils提供的一个接口,用于从数据库结果集中提取数据并映射到Java对象。...
在这个场景中,我们将从Java应用程序收集一系列用户数据,将其转换为Oracle数组,然后调用一个预定义的存储过程进行批量更新操作。 #### 五、注意事项与优化建议 - **类型匹配**:确保Java对象属性与数据库对象...
在C++编程中,二维数组是一种非常常见的数据结构,它被广泛用于表示表格或矩阵等数据。本篇文章将深入探讨如何将二维数组作为函数的形参进行传递,以实现特定的功能,例如本例中的二维数组求和。我们将讨论两种主要...
C语言中二维数组作为函数参数来传递的三种方法 在C语言中,二维数组作为函数参数来传递是非常常见的操作。但是,如何正确地传递二维数组作为函数参数却是许多初学者和开发者经常混淆的地方。今天,我们将详细介绍...
4. **编写事件处理程序**:双击`Button1`,在`Button1Click`事件处理程序中编写代码以调用Oracle存储过程。 #### Delphi中调用Oracle存储过程 以下是完整的Delphi代码示例,用于调用上述创建的Oracle存储过程: `...
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或数据操作时。本文将深入探讨如何使用Java与Oracle数据库进行交互,并调用存储过程。 首先,确保你已经在你的开发环境中安装了...
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其在处理复杂业务逻辑或数据操作时。本文将详细讲解如何使用Java调用Oracle存储过程,并提供示例代码。 首先,我们需要了解Java中用于与数据库交互的核心...
在Java编程中,调用Oracle数据库的存储过程是常见的任务,尤其当涉及到复杂的数据处理或事务操作时。本文将深入探讨如何使用Java来调用Oracle存储过程,特别是涉及游标的场景。 首先,Oracle存储过程是一种预编译的...
"Mybatis调用Oracle存储过程传List参数解决方法" Mybatis是当前最流行的持久层框架之一,它提供了强大的数据访问和操作功能。但是,如何将List类型参数传递给Oracle存储过程,实现批量插入数据却是一个棘手的问题,...
在IT领域,特别是数据库操作与Java开发中,利用ibatis框架调用Oracle存储过程是一个常见的需求,这不仅能够提升代码的执行效率,还能增强应用程序的安全性。本文将深入解析ibatis如何与Oracle数据库中的存储过程进行...
本话题将详细讲解如何使用Java调用带有参数的Oracle存储过程,并获取存储过程返回的集合。 首先,Oracle存储过程是一种预编译的SQL语句集合,它可以在数据库服务器端执行,提高性能,减少网络传输。`PROCEDURE.sql`...
1. **二维数组**: 一种数据结构,可以视为由多个一维数组构成的数组。二维数组通常用来表示矩阵或表格形式的数据。 2. **最大值**: 数组中所有元素中的最大数值。 3. **行列位置**: 在二维数组中,每个元素都有一个...