Java中调用参数是数组的存储过程
2009-02-23 14:23
309 查看
Java中调用参数是数组的存储过程
1. 存储过程以及类型定义如下:
--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procedure(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procedure(
ids IN idArray,
exist OUT NUMBER) AS
v_Index BINARY_INTEGER;
BEGIN
v_Index:= ids.FIRST;
LOOP
SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent'
AND book_id=ids(v_Index);
EXIT WHEN v_Index=ids.LAST OR exist>0;
v_Index:= ids.NEXT(v_Index);
END LOOP;
END Book_Check_Procedure;
END Lib_Package;
2.在Java中调用上面的存储过程
(1) 在Oracle中定义数组类型idArray
(2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程
/**
* 当要删除图书时,检查是否仍然有图书复本处于借出状态
*/
public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false;
Connection conn = null;
OracleCallableStatement cstmt = null;
ArrayDescriptor desc = null;
ARRAY bookIdArray = null;
int count = 0;
String sql = "{call LIB_PACKAGE.Book_Check_Procedure(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance();
conn = dbManager.getConnection(Constants.DATABASE);
try {
cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定义oracle中的数组类型
desc = ArrayDescriptor.createDescriptor("IDARRAY", conn);
bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.execute();
count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt);
DbOperHelp.closeConnection(this.getClass(), conn);
} catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: "
+ e.getMessage());
DbOperHelp.closeStatement(this.getClass(), cstmt);
DbOperHelp.closeConnection(this.getClass(), conn);
throw new DataAccessException(
"When check the books, there is a SQLException: "
+ e.getMessage(), e.getCause());
}
if (count > 0) {
flag = true;
}
return flag;
}
3.注意的情况
问题:
存储过程的参数中含有VARRAY、TABLE类型,目的是为了传入一批数据,前端用java,但是java怎么设置这两种类型参数呢???
解决方法:
在Oracle安装目录发现例子,安装目录下/ora92/jdbc/demo/demo/samples/jdbcoci下的PLSQLIndexTab。可能遇到的问题:连接为oci连接,thin连接不行,增加nls_charset12.jar包,不然会出现java.sql.SQLException: Non supported character set: oracle-character-set-852异常。
1. 存储过程以及类型定义如下:
--The array in oracle
CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);
--package header
CREATE OR REPLACE PACKAGE Lib_Package AS
PROCEDURE Book_Check_Procedure(ids IN idArray, exist OUT NUMBER);
END Lib_Package;
--package body
CREATE OR REPLACE PACKAGE BODY Lib_Package AS
PROCEDURE Book_Check_Procedure(
ids IN idArray,
exist OUT NUMBER) AS
v_Index BINARY_INTEGER;
BEGIN
v_Index:= ids.FIRST;
LOOP
SELECT COUNT(*) INTO exist FROM Lib_Duplicate WHERE status='Lent'
AND book_id=ids(v_Index);
EXIT WHEN v_Index=ids.LAST OR exist>0;
v_Index:= ids.NEXT(v_Index);
END LOOP;
END Book_Check_Procedure;
END Lib_Package;
2.在Java中调用上面的存储过程
(1) 在Oracle中定义数组类型idArray
(2) 在java构造数组并转换成Oracle中定义的数组类型,调用存储过程
/**
* 当要删除图书时,检查是否仍然有图书复本处于借出状态
*/
public boolean checkBookStatus(String[] bookIds) throws DataAccessException {
boolean flag = false;
Connection conn = null;
OracleCallableStatement cstmt = null;
ArrayDescriptor desc = null;
ARRAY bookIdArray = null;
int count = 0;
String sql = "{call LIB_PACKAGE.Book_Check_Procedure(?,?)}";
DbDriverManager dbManager = DbDriverManager.getInstance();
conn = dbManager.getConnection(Constants.DATABASE);
try {
cstmt = (OracleCallableStatement) conn.prepareCall(sql);
//定义oracle中的数组类型
desc = ArrayDescriptor.createDescriptor("IDARRAY", conn);
bookIdArray = new ARRAY(desc, conn, bookIds);
cstmt.setObject(1, bookIdArray, oracle.jdbc.OracleTypes.ARRAY);
cstmt.registerOutParameter(2, Types.INTEGER);
cstmt.execute();
count = cstmt.getInt(2);
log.info(this.getClass() + ".checkBookStatus: count = " + count);
DbOperHelp.closeStatement(this.getClass(), cstmt);
DbOperHelp.closeConnection(this.getClass(), conn);
} catch (SQLException e) {
log.error(this.getClass() + ".checkBookStatus-->SQLException: "
+ e.getMessage());
DbOperHelp.closeStatement(this.getClass(), cstmt);
DbOperHelp.closeConnection(this.getClass(), conn);
throw new DataAccessException(
"When check the books, there is a SQLException: "
+ e.getMessage(), e.getCause());
}
if (count > 0) {
flag = true;
}
return flag;
}
3.注意的情况
问题:
存储过程的参数中含有VARRAY、TABLE类型,目的是为了传入一批数据,前端用java,但是java怎么设置这两种类型参数呢???
解决方法:
在Oracle安装目录发现例子,安装目录下/ora92/jdbc/demo/demo/samples/jdbcoci下的PLSQLIndexTab。可能遇到的问题:连接为oci连接,thin连接不行,增加nls_charset12.jar包,不然会出现java.sql.SQLException: Non supported character set: oracle-character-set-852异常。
相关文章推荐
- Oracle-存储过程-参数为数组-返回值为集合,java-调用存储过程
- java调用oracle中输入参数是数组类型的函数或者存储过程
- java结构化参数调用存储过程
- java 调用oracle存储过程传入 数组参数 不用纯jdbc连接
- JAVA程序调用MYSQL带有OUTPUT参数的存储过程
- java 调用存储过程 传入数组
- java调用输入参数、输出参数、输出参数为列表的存储过程(一)
- java中的arrayList传入oracle中的以数组(array)为参数的存储过程
- Java中调用参数是数组的存储过程
- java调用oracle存储过程传入参数为数组的处理
- java调用参数为数组的存储过程
- JAVA JDBC 调用存储过程 传参数
- C通过JNI调用JAVA——创建Object数组参数
- 在java的hibernate3框架中调用oracle数据库中带游标参数的存储过程
- java 调用存储过程 传入和返回全部是自定义数组
- JAVA本地方法调用(2)数组参数传递
- JAVA调用ORACLE带数组输入参数和返回游标结果集的存储过程
- java调用oracle含输入和输出数组的存储过程
- JAVA程序调用MYSQL带有OUTPUT参数的存储过程
- java中调用存储过程并传递list集合参数的方法