失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > java中调用数组参数_java中如何调用带有数组类型参数的存储过程

java中调用数组参数_java中如何调用带有数组类型参数的存储过程

时间:2024-06-08 16:24:24

相关推荐

java中调用数组参数_java中如何调用带有数组类型参数的存储过程

java中如何调用带有数组类型参数的存储过程

关注:95答案:3mip版

解决时间 -01-28 00:39

提问者万丈深渊

-01-27 14:00

不知道java中java.sql.Array如何使用

letitia61 ,没有看明白。我想向存储过程传递数组类型的参数,如何构造这个数组呢?比方说,我有一个String[] s={"a","b"} ,如何将其转换成java.sql.Array类型的对象呢?

最佳答案

二级知识专家时光暗淡了承诺

-01-27 15:36

1. 存储过程以及类型定义如下:

--Thearrayinoracle

CREATEORREPLACeTYPEidArrayASTABLEOFVARCHAr2(20);

--packageheader

CREATEORREPLACEPACKAGELib_PackageAS

PROCEDUREBook_Check_Procedure(idsINidArray,existOUTNUMBER);

ENDLib_Package;

--packagebody

CREATEORREPLACEPACKAGEBODYLib_PackageAS

PROCEDUREBook_Check_Procedure(idsINidArray,existOUTNUMBER)ASv_IndexBINARY_INTEGER;BEGINv_Index:=ids.FIRST;LOOPSELECTCOUNT(*)INTOexistFROMLib_DuplicateWHERestatus='Lent'ANDbook_id=ids(v_Index);EXITWHENv_Index=ids.LASTORexist>0;v_Index:=ids.NEXT(v_Index);ENDLOOP;ENDBook_Check_Procedure;

ENDLib_Package;2.在Java中调用上面的存储过程

(1)在Oracle中定义数组类型idArray

(2)在java构造数组并转换成Oracle中定义的数组类型,调用存储过程

publicbooleancheckBookStatus(String[]bookIds)throwsDataAccessException{

booleanflag=false;Connectionconn=null;OracleCallableStatementcstmt=null;ArrayDescriptordesc=null;ARRAYbookIdArray=null;intcount=0;Stringsql="{callLIB_PACKAGE.Book_Check_Procedure(?,?)}";

DbDriverManagerdbManager=DbDriverManager.getInstance();conn=dbManager.getConnection(Constants.DATABASE);

try{cstmt=(OracleCallableStatement)conn.prepareCall(sql);

//定义oracle中的数组类型desc=ArrayDescriptor.createDescriptor("IDARRAY",conn);bookIdArray=newARRAY(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(SQLExceptione){

log.error(this.getClass()+".checkBookStatus-->SQLException:"+e.getMessage());DbOperHelp.closeStatement(this.getClass(),cstmt);DbOperHelp.closeConnection(this.getClass(),conn);thrownewDataAccessException("Whencheckthebooks,thereisaSQLException:"+e.getMessage(),e.getCause());}

if(count>0){

flag=true;}

returnflag;}

全部回答

1楼久而旧之

-01-27 17:15

值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值。

引用传递:也称为传地址。方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,方法执行中形式参数值的改变将会影响实际参数的值。

下面举例说明:

传值---传递基本数据类型参数

public class passvalue{

static void exchange(int a, int b){//静态方法,交换a,b的值

int temp;

temp = a;

a = b;

b = temp;

}

public static void main(string[] args){

int i = 10;

int j = 100;

system.out.println("before call: " + "i=" + i + "\t" + "j = " + j);//调用前

exchange(i, j); //值传递,main方法只能调用静态方法

system.out.println("after call: " + "i=" + i + "\t" + "j = " + j);//调用后

}

}

运行结果:

before call: i = 10 j = 100

after call: i = 10 j = 100

说明:调用exchange(i, j)时,实际参数i,j分别把值传递给相应的形式参数a,b,在执行方法exchange()时,形式参数a,b的值的改变不影响实际参数i和j的值,i和j的值在调用前后并没改变。

引用传递---对象作为参数

如果在方法中把对象(或数组)作为参数,方法调用时,参数传递的是对象的引用(地址),即在方法调用时,实际参数把对对象的引用(地址)传递给形式参数。这是实际参数与形式参数指向同一个地址,即同一个对象(数组),方法执行时,对形式参数的改变实际上就是对实际参数的改变,这个结果在调用结束后被保留了下来。

class book{

string name;

private folat price;

book(string n, float ){ //构造方法

name = n;

price = p;

}

static void change(book a_book, string n, float p){ //静态方法,对象作为参数

a_book.name = n;

a_book.price = p;

}

public void output(){ //实例方法,输出对象信息

system.out.println("name: " + name + "\t" + "price: " + price);

}

}

public class passaddr{

public static void main(string [] args){

book b = new book("java2", 32.5f);

system.out.print("before call:\t"); //调用前

b.output();

b.change(b, "c++", 45.5f); //引用传递,传递对象b的引用,修改对象b的值

system.out.print("after call:\t"); //调用后

b.output();

}

}

运行结果:

before call: name:java2 price:32.5

after call: name:c++ price:45.5

说明:调用change(b,"c++",45.5f)时,对象b作为实际参数,把引用传递给相应的形式参数a_book,实际上a_book也指向同一个对象,即该对象有两个引用名:b和a_book。在执行方法change()时,对形式参数a_book操作就是对实际参数b的操作。

2楼噯ㄖ詘,美

-01-27 16:55

java.sql

接口 Array

所有已知实现类:

SerialArray

SQL 类型 ARRAY 在 Java 编程语言中的映射关系。默认情况下,Array 值是对 SQL ARRAY 值的事务处理期引用。默认情况下,Array 对象是使用 SQL LOCATOR(array) 内部实现的,这意味着 Array 对象包含一个指向 SQL ARRAY 值中数据的逻辑指针,而不是包含 ARRAY 值的数据。

Array 接口提供了某些方法将 SQL ARRAY 值的数据作为数组或 ResultSet 对象传送到客户端。如果 SQL ARRAY 的元素是一个 UDT,那么可以自定义映射它们。要创建自定义映射关系,编程人员必须做两件事:

为将被自定义映射的 UDT 创建一个实现 SQLData 接口的类。

在类型映射表中生成一个项,该项包含

UDT 的完全限定 SQL 类型名称

实现 SQLData 的类的 Class 对象

在将带有对应于基本类型的项的类型映射表提供给 getArray 和 getResultSet 方法时,该表所包含的映射关系将用于映射 ARRAY 值的元素。如果没有提供类型映射表(通常是这种情况),则默认使用连接的类型映射表。如果该连接的类型映射表或为某一方法提供的类型映射表没有对应于基本类型的项,则根据标准映射关系来映射这些元素。

getArray()

以 Java 编程语言数组的形式检索由此 Array 对象指定的 SQL ARRAY 值的内容。

getArray(long index, int count)

检索由此 Array 对象指定的 SQL ARRAY 值的一部分,从指定 index 开始,包含 SQL 数组中 count 个连续元素。

getArray(long index, int count, Map> map)

检索由此 ARRAY 对象指定的 SQL Array 值的一部分,从指定 index 开始,包含 SQL 数组中 count 个连续元素。

getArray(Map> map)

检索由此 Array 对象指定的 SQL ARRAY 值的内容。

getBaseType()

在由此 Array 对象指定的数组中检索元素的 JDBC 类型。

getBaseTypeName()

在由此 Array 对象指定的数组中检索元素的 SQL 类型名称。

getResultSet()

检索包含此 Array 对象指定的 SQL ARRAY 值的元素的结果集合。

getResultSet(long index, int count)

检索保存子数组的元素的结果集合,从索引 index 开始,包含 count 个连续元素。

getResultSet(long index, int count, Map> map)

检索保存子数组的元素的结果集合,从索引 index 开始,包含 count 个连续元素。

getResultSet(Map> map)

检索包含由此 Array 对象指定的 SQL ARRAY 值的元素的结果集合。

我要举报

如以上问答内容为低俗/色情/暴力/不良/侵权的信息,可以点下面链接进行举报,我们会做出相应处理,感谢你的支持!

→点此我要举报以上信息!←

推荐资讯

大家都在看

如果觉得《java中调用数组参数_java中如何调用带有数组类型参数的存储过程》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。