数据库部分:
-----------------------------------------------------------------------------------------------------------------
为了保证写出来的都是可以运行的,所以每次创建表、类型等等,都先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;
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加入到工程,重新编译即可!
分享到:
相关推荐
总的来说,理解如何在Spring中正确地调用Oracle存储过程并传递数组参数是提高应用程序效率和数据库操作灵活性的重要技能。这涉及到了数据库设计、Java编程、Spring框架的使用以及对Oracle特定特性的掌握。通过上述...
Java调用Oracle存储过程返回结果集(Record)是指在Java程序中通过调用Oracle存储过程来获取记录集的结果。下面将详细介绍相关知识点。 创建Type 在Oracle中,需要创建两个Type类型:`myScalarType`和`myTableType...
通过本文的探讨,我们不仅了解了如何在Java中调用Oracle存储过程并传递集合参数的基本原理,还深入实践了相关的技术细节。这对于构建高性能、高可靠性的企业级应用而言,是不可或缺的知识点。在未来,随着数据量的...
本篇文章将详细介绍一个用于Java应用程序中调用Oracle存储过程的通用类,帮助开发者更高效地实现相关功能。 #### 核心知识点解析 ##### 1. 类的基本结构 此通用类位于`com.gemship.common.service.impl`包下,名...
"Mybatis调用Oracle存储过程传List参数解决方法" Mybatis是当前最流行的持久层框架之一,它提供了强大的数据访问和操作功能。但是,如何将List类型参数传递给Oracle存储过程,实现批量插入数据却是一个棘手的问题,...
总结,Java调用Oracle存储过程涉及的关键点包括:JDBC连接,CallableStatement,输入/输出参数的设定,以及结果集的处理。理解这些知识点,能够帮助开发者有效地实现数据库操作,提升应用性能。
在本文中,我们将探讨如何在Mybatis框架中调用PostgreSQL的存储过程,特别是处理 PostgreSQL 的数组类型作为存储过程的输入参数。Mybatis是一个流行的Java持久层框架,它允许开发者编写SQL语句,并与Java对象进行...
在软件开发中,熟练掌握Oracle存储过程的调用是必要的,因为它能提高应用程序的性能,减少网络传输,并提供更好的数据库安全性。 1. ORA-00921: unexpected end of SQL command 这个错误通常是因为SQL语句的语法不...
"JDBC执行Oracle传入参数为集合对象的存储过程"这个标签提示了如何通过Java的JDBC接口调用Oracle存储过程。JDBC(Java Database Connectivity)是Java语言连接数据库的标准API,它提供了多种方法来调用存储过程,...
用java调用oracle存储过程,传入数组参数,数组项为空值。
在Java的持久化框架Hibernate中,调用数据库的存储过程是一项常见的需求。本文将深入探讨在Hibernate3中如何实现这一功能,以及相关的知识点。 一、为什么要使用存储过程 存储过程是预编译的SQL语句集合,它们在...
描述中提到的“解决oracle11g存储过程传入数组空的问题”涉及到Oracle PL/SQL中的数组类型。在PL/SQL中,我们可以定义变量为数组类型,以便一次性处理多个值。但是,如果这些数组可能包含空值(NULL),我们需要特别...
在论文“大学毕业论文---oracleobject设计.doc”中,作者探讨了如何在数据库设计中利用 OracleObject 实现数据表与对象的解耦,以及在 Java 应用程序中调用这些对象的方法。 首先,论文提到了三个主要的数据表:...
在使用 OracleObject 时,我们需要定义 ParamValuePairList,是传入 SQL 语句或者存储过程的参数的集合,包括 SqlInParameter,SqlOutParameter。如果使用 OracleObject,我们可以轻易地传入 TradeObject 这个由 ...
这个存储过程的使用方式是在PL/SQL代码或Java、C#等支持Oracle存储过程调用的编程语言中调用`account_month`函数,传入日期参数,并接收返回的"T_ACCOUNT_MONTH_TABLE"对象。在应用程序中,可以进一步处理这个数组...
5. 数组和集合:数组是存储同类型数据的序列,而集合框架(如ArrayList、LinkedList、HashMap等)则提供了更灵活的数据存储和操作方式。 【面向对象编程】 面向对象编程(OOP)是Java的核心特性。它包括封装、继承...
根据给定的文件信息,以下是对“java功能代码”中几个关键知识点的详细解析: ### 1. 向Java文件中添加文本 在Java中,向文件中添加文本通常涉及使用`BufferedWriter`和`FileWriter`类。示例代码展示了如何在不...