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

作者&投稿:宋使 (若有异议请与网页底部的电邮联系)
在JAVA中怎么调用带参数的存储过程?~

JDBC调用存储过程: CallableStatement
在Java里面调用存储过程,写法那是相当的固定:
Class.forName(....
Connection conn = DriverManager.getConnection(....
/**
*p是要调用的存储过程的名字,存储过程的4个参数,用4个?号占位符代替
*其余地方写法固定
*/
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");
/**
*告诉JDBC,这些个参数,哪些是输出参数,输出参数的类型用java.sql.Types来指定
*下面的意思是,第3个?和第4个?是输出参数,类型是INTEGER的
*Types后面具体写什么类型,得看你的存储过程参数怎么定义的
*/
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
/**
*在我这里第1个?和第2个?是输入参数,第3个是输出参数,第4个既输入又输出
*下面是设置他们的值,第一个设为3,第二个设为4,第4个设置为5
*没设第3个,因为它是输出参数
*/
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three = cstmt.getInt(3);
System.out.println(three);
//把第4个参数的值当成int类型拿出来
int four = cstmt.getInt(4);
System.out.println(four);
//用完别忘给人家关了,后开的先关
cstmt.close();
conn.close();

JDBC调用存储过程,掌握这一个程序足够了.
以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.

create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp + 1;
end;

1、创建带输出参数的存储过程 如: 在查询分析器中执行declare @mg nvarchar(100)exec proc_CSCO_SalesFctByStore 100,200,'name',@mg outputprint @mg 在Java中调用import java.sql.*;public class Test{public static void main(String args[]) throws Exception {//加载驱动DriverManager.registerDriver(new sun.jdbc.odbc.JdbcOdbcDriver()); //获得连接Connection conn = DriverManager.getConnection("jdbc:odbc:mydata", "sa",""); //创建存储过程的对象CallableStatement c = conn.prepareCall("{call proc_CSCO_SalesFctByStore(?,?,?,?)}"); //给存储过程的第一个参数设置值c.setInt(1, 100); //给存储过程的第一个参数设置值c.setInt(2, 10000); //给存储过程的第一个参数设置值c.setString(3, user); //注册存储过程的第四个参数c.registerOutParameter(4, java.sql.Types.VARCHAR); //执行存储过程c.execute(); //得到存储过程的输出参数值

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<String,Class<?>> map)
检索由此 ARRAY 对象指定的 SQL Array 值的一部分,从指定 index 开始,包含 SQL 数组中 count 个连续元素。

getArray(Map<String,Class<?>> 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<String,Class<?>> map)
检索保存子数组的元素的结果集合,从索引 index 开始,包含 count 个连续元素。

getResultSet(Map<String,Class<?>> map)
检索包含由此 Array 对象指定的 SQL ARRAY 值的元素的结果集合。

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; }


跟普通一样


ava头盔怎么扣
1、首先,用手拿起ava头盔的卡扣部分。2、然后将带子穿入两个孔内。3、再绕过后扣穿进前扣。4、最后调整下巴松紧度拉紧即可。

AVA 里空格怎么输 求带空格的名字
先改成智能ABC。 然后随便打一个字母 要字母噢。 然后在打'''3个阿。 就是空格旁边的。 就是这样。a''' 然后不要按空格 按俩下回车。 然后把页翻到最后一页。 然后选第2个。 打完了就成空格了 (���) 希望采纳!!!

ava传送之门是怎么玩的 啊 我一点也不会
那个两方都有一个控制器 把对方的带过来 跑到你这边控制器上就行了 成功后会发射一枚火箭 那方先成功五次 那方赢 控制器在中间通道的两头 夺对方同时保护自己的不被对方夺去 那个模式有刷黑房的 房名带小号升级 刷经验一类的都是黑房 进去大号都没准备 让你按F5的也是黑房 ...

在AVA里面看见有人的名字带有_,多少个这个符号比较好看?
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000个,非常好看 ...

AVA华东一区生存求带
兰州最好办法就是和朋友一起打 如果没有朋友 就开房 名字叫做:红牌娱乐 狗比误入 --- 如果只有上士的话 就叫做 上士以上 会的来 --- 中士的话 就算你会也强不到哪去

AVA如何带俩手雷
AVA商店里有个背包的选项点进去,有个投掷武器加1注意背包B 和背包C都可以买一个!还要注意的是另外两个手雷只能是烟雾。

现在AVA峡谷单刷弯刀的脚本还能用吗
脚本不能用了 自己生存频道找8人房 或者5人五命的房 还是很好过的

AVA里的GP眼镜带上怎么不显示?
~这个~基本没用。侦察兵你就算不带他本来就有护镜。这个我也专门研究过,就算换角色也不显示。

什么叫做“海岸葡萄酒”?
Robert Mondavi Private Selection的葡萄园就在这条谷中。Robert Mondavi Private Selection 用中央海岸带葡萄酿出的酒一般都标着Coastal,这在加州许多酒园的酒标上可以见到。也有独特的,Robert Mondavi Private Selection(罗伯特·蒙大菲私选)就是从Coastal演变过来,为的是强调用来自最好葡萄园的葡萄酿出...

AVAP90要改TR吗?
一定要改。不改的话简直是浪费子弹,准确度低的吓人。改成TR后会发现没有属性变化,但其实性能真的提高不少。不信你可以建小号买一把P90玩一局,然后改成TR再玩一局就知道好处了。上面那几个人说不要改,其实说的是MP5 PDW不要改成Rail,记错了吧。还有那个说P90不行的,我怎么没见几个人用...

梁河县17814367711: java中如何调用带有数组类型参数的存储过程 -
守玛天丹: 1. 存储过程以及类型定义如下:--The array in oracle CREATE OR REPLACE TYPE idArray AS TABLE OF VARCHAR2(20);--package header CREATE OR REPLACE PACKAGE Lib_Package ASPROCEDURE Book_Check_Procedure(ids IN ...

梁河县17814367711: java中如何调用带类类型参数的构造方法 -
守玛天丹: 1 如果在子类中调用 ,那么先new 一个参数所在类型的对象a,即 A a = new A(),然后在子类中用super(a)就可以调用父类的带类参数构造方法. 2 如果在其他类中调用,那么也需要先new 一个参数所在类型的对象a,即 A a=new A();,然后new调用类的的时候把参数传进去就可以了,B b = new B(a).

梁河县17814367711: java中在一个类怎么调用另一个类中的数组中的某个元素 最好以带的形式说明 -
守玛天丹: 如果那个数组的修饰符是public的话,用被调用类的一个对象加点号再加数组名就可以了,如果是private或者protected的话,不能在类外调用.

梁河县17814367711: JAVA中在调用带参数的类 -
守玛天丹: 你要调用的类必须有带参数的构造方法.比如 class dog { private string name; public dog(string s) { name=s; } } 然后你就可以这样写你的主方法 public static void main(String args[]){ dog blackdog=new dog("小狗"); } 这样就行了.如果构造器那什么都不写的话,就是默认的构造器,是没有任何参数的,所以再使用new参数的时候会出现错误..

梁河县17814367711: java中一个类向另一个类传一个数组参数怎样实现 一定要实现,最好给个例题看看 -
守玛天丹: 这个问题要从整体理解入手: 一:分别定义两个类:如A 和B:public class A { public String[] array = new String[]{"A","B","C"}; public static void main(String[] args){ A a = new A(); B b = new B(a.array); b.outputArray(); } } class B { private ...

梁河县17814367711: java中对象数组类型的参数 -
守玛天丹: 值传递:方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参 数的值. 引用传递:也称为传地址.方法调用时,实际参数的引用(地址,而不是参数的值)被传递给方法中相对应的形式参数,在...

梁河县17814367711: java 对象数组类型作为参数怎么理解? -
守玛天丹: public void printArray(int[] arr){ for(int i=0; i< arr.length; i++){ System.out.println(arr[i]); } } 这就叫吧数组作为参数.够清楚了吗?

梁河县17814367711: java中一个类中声明并赋值了一个数组,在其他类中要怎么调用数组,并可以更改数组里面的值 -
守玛天丹: 应该在a类中加入一个方法,例如: public int[] getArray(){ return array; } 这样在b中先创建一个A类的对象: A a = new A(); 然后就可以用a.getArray来调用这个数组了.

梁河县17814367711: Java怎么调用方法里定义的数组啊 -
守玛天丹: 方法里定义的变量,只能在方法内部使用.在方法外部,超出了变量的作用域,也即无法使用的. 要在别的方法内使用,必须把这个变量的定义放到方法外来.

梁河县17814367711: java中一个类中的方法的形参有数组,在调用时候,该实参怎么写? -
守玛天丹: package demo; public class demo { private static void f1(int[] array){ for(int i:array){ system.out.println(i); } } public static void main(string[] args) { int[] array = new int[5]; for(int i=0;i array[i]=i; } f1(array); } }//说明:main方法中的array数组即是实参,而方法f1中的数组array则是形参

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网