参看了前人的一些资料,自己试了试,有几处改进:
1.关于字符集:11g的jdbc驱动叫orai18n.jar,之前是nls_charset.jar/classes12.jar
2.ArrayDescriptor:java传入oracle的数组需要处理一下
3.oracle.jdbc.OracleTypes.CURSOR:java获得oracle的游标。
package TEST;
import java.sql.*;
import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import oracle.sql.ARRAY;
import oracle.sql.ArrayDescriptor;
public class test_array {
static Connection connMyDB = null;
public static Connection connDB() {
Statement stmt;
ResultSet rs;
PreparedStatement pstmt;
String driver = "oracle.jdbc.driver.OracleDriver";
String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:wydb";
try {
Class.forName(driver);
connMyDB = DriverManager.getConnection(strUrl, "dev", "dev");
} catch (SQLException ex) {
Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
} catch (ClassNotFoundException ex) {
Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
}
return connMyDB;
}
public static void main(String args[]) {
ArrayList arrList = new ArrayList();
try {
CallableStatement proc = connDB().prepareCall("{ call p_web_sql_kpi(?,?,?,?,?,?,?,?,?,?) }"); //调用存储过程
//不一样的地方,获得上面创建的自定义的类型,注意大小写
ArrayDescriptor descriptor = ArrayDescriptor.createDescriptor("VARRAY_LIST", connMyDB);
List list = new ArrayList();
list.add("TRAFFIC_PD");
list.add("TRAFFIC_TCH");
list.add("REQ_TBF_DL_GPRS");
//把list中的元素转换成自定义的类型
ARRAY array = new ARRAY(descriptor, connMyDB, list.toArray());
/*重要!这里输出的全是“???”试验NLS
备注:如果在入库的过程中发现字符串的值没有入进去,
请检查有没有加载该类库orai18n.jar(11g之前:nls_charset12.jar)*/
String[] tem = (String[]) array.getArray();
for (String str : tem) {
System.out.println(str);
}
//设置参数, 和普通的一样
proc.setString(1, "LC");
proc.setString(2, "201104自行车赛");
proc.setString(3, "2011-05-31");
proc.setString(4, "2011-06-01");
proc.setInt(5, 9);
proc.setInt(6, 11);
proc.setArray(7, array);
proc.setInt(8, 1);
proc.setInt(9, 10);
proc.registerOutParameter(10, oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
ResultSet rs = (ResultSet) proc.getObject(10);
int cols = rs.getMetaData().getColumnCount();//width=how many cols
while (rs.next()) {
for (int i = 1; i <= cols; i++) {
System.out.print(rs.getString(i));
if (i != cols) {
System.out.print(" / ");//列之间的间隔符,最后1列不需要
}
}
System.out.println();
}
rs.close();
proc.close();
} catch (Exception ex) {
ex.getMessage();
} finally {
try {
connMyDB.close();
} catch (SQLException ex) {
Logger.getLogger(test_array.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
}
我们的数据库字符编码一般选zhs16GBK用以支持中文,字符集不对,把nls_charset12.jar(11g以前的)添加到classpath里面去,jdbc的lib下面。
对于Oracle 11g R2+WINDOWS SERVER 2003:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0
Oracle Database 11g Release 2 JDBC Drivers 的解释:
ojdbc5.jar 用于 JDK 1.5 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
ojdbc6.jar 用于 JDK 1.6 的类。它包含 JDBC 驱动程序类,但不包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
orai18n.jar 用于 JDK 1.5 和 1.6 的 NLS 类。它包含在 Oracle Object 和 Collection 类型中支持 NLS 的类。
该文件代替旧的nls_charset.jar/classes12.jar 文件。
orai18n.jar - NLS classes for use with JDK 1.5, and 1.6. It contains classes for NLS support in Oracle Object and Collection types. This jar file replaces the old nls_charset jar/zip files.
下载网址,请用迅雷,否则需要注册的用户名和密码:
http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090769.html
sqlplus的command窗口下:
var v_result refcursor
declare
v_kpi varray_list;
begin
p_web_sql_kpi(v_usr => '星星星',
v_ciset => '201104自行车赛',
v_date_begin => '2011-05-31',
v_date_end => '2011-06-01',
v_time_begin => '9',
v_time_end => '11',
v_kpi => varray_list('TRAFFIC_TCH',
'TRAFFIC_PD',
'REQ_TBF_DL_GPRS'),
v_startidx => 1,
v_endidx => 10,
v_result => :v_result);
end;
/
print v_result
分享到:
相关推荐
本文介绍了Java调用Oracle存储过程返回结果集Record和Cursor的相关知识点,包括创建Type、PACKAGE和PROCEDURE,Java代码中调用存储过程,并获取结果集。这些知识点对深入了解Oracle存储过程和Java调用Oracle存储过程...
### JAVA调用ORACLE存储过程通用类 #### 概述 在Java开发中,经常会遇到需要与数据库交互的情况,特别是当涉及到复杂的业务逻辑时,利用数据库的存储过程可以有效地提高程序性能并简化代码结构。本篇文章将详细...
在Java编程中,与Oracle数据库交互是常见的任务之一,而调用Oracle存储过程可以实现复杂的业务逻辑。本文将深入探讨如何在Java中调用Oracle存储过程,并输出自定义对象或二维表,以此提升数据处理效率。 首先,我们...
### Oracle集合类型输出参数的PL/SQL存储过程及其Java调用 #### 1. 引言 存储过程因其高效执行、事务处理能力以及安全性,在数据库应用程序中被广泛应用。特别是使用Oracle数据库时,PL/SQL(一种专为Oracle设计的...
#### 八、Java调用Oracle存储过程 - **无返回值的存储过程**: 可以直接调用存储过程,无需关注返回值。 - **有返回值的存储过程**: - 非列表返回: 通常使用简单的数据类型作为返回值。 - 列表返回: 使用游标或...
5. **使用Java调用Oracle存储过程**: - **无返回值的存储过程**: 可以直接调用,如使用`CallableStatement`对象。 - **有返回值的存储过程**: - 非列表类型: 通过注册输出参数来接收返回值。 - 返回列表: 通常...
首先,存储过程是一组为了完成特定功能的SQL语句集,它可以接受参数、执行复杂的逻辑,并可以返回结果。存储过程的执行速度快,因为它们在第一次执行时会被编译和优化,在后续调用时可以直接使用优化后的代码。 ...
2. **函数与过程**:如何定义和调用用户自定义的函数和过程,理解输入参数、输出参数、IN OUT参数的区别和使用。 3. **游标**:在PL/SQL中如何使用游标处理单行或多行数据,以及游标的声明、打开、关闭和循环遍历。...
5. **游标**:讲解如何使用游标进行动态查询和逐行处理结果集,包括显式和隐式游标,以及游标的使用技巧。 6. **集合类型**:介绍PL/SQL中的数组、关联数组、嵌套表和集合操作,这些在处理大量数据时非常有用。 7....
15. **与Java和.NET的互操作性**:10g版本加强了与其他语言的集成,支持调用Java存储过程和使用.NET组件。 通过深入学习和实践这些知识点,你将能够熟练掌握Oracle 10g PL/SQL,为数据库管理和应用程序开发打下坚实...
4. **游标**:游标用于在结果集上进行迭代,是处理单行数据或动态结果集的有效工具。书中的这一部分可能详细讲解了游标的使用和管理。 5. **表和记录变量**:这些变量可以用来存储多行数据,类似于数组。它们在处理...
5. **游标**:在处理大量数据时,游标允许我们逐行处理结果集,它是PL/SQL中处理数据库查询结果的重要工具。 6. **存储过程与函数**:存储过程是一组预编译的SQL和PL/SQL语句,可以提高性能并减少网络流量;函数则...
- **PL/SQL过程调用表示法**:调用存储过程的方法。 - **PL/SQL函数返回多行**:返回集合数据。 - **PL/SQL调用Java类**:结合Java代码增强PL/SQL的功能。 - **PL/SQL异常机制**:处理运行时错误。 - **PL/SQL...
7. **存储过程与函数**:存储过程是一组可重复使用的PL/SQL代码,可以在数据库中存储和调用。函数则返回一个值,常用于计算和业务逻辑。 8. **触发器**:触发器是在特定数据库事件(如INSERT、UPDATE、DELETE)发生...
- **调用函数与过程**:通过PreparedStatement执行存储过程或函数。 - **DAO封装**:Data Access Object模式,封装数据访问逻辑。 以上内容涵盖了Oracle数据库的基础知识、核心概念以及相关技术和操作要点,旨在...
这通常涉及到传递参数和控制流程。 **28. FORM遍历数据块** - 遍历数据块是处理大量数据时常用的技术。这可以通过编写循环代码来实现。 **29. Form实现复制上条记录** - 一种常见的需求是在表格中快速复制上一条...
4. **游标**:利用游标处理单行或多行结果集,进行迭代操作,以实现更灵活的数据处理。 5. **表和记录类型**:定义并使用记录类型来处理表格数据,以及如何操作嵌套表和关联数组。 6. **动态SQL**:使用EXECUTE ...
10. **数据库连接和调用接口**:PL/SQL可以与其他编程语言(如Java、C++)交互,通过Oracle Call Interface (OCI)或JDBC调用PL/SQL过程,实现跨平台的数据访问和处理。 通过《ORACLE PL/SQL程序设计第五版》,你将...