java中如何调用sqlserver数据库中的自定义的存储过程???????

windtree 2006-03-06 03:24:23
我用java调用存储过程,语句好像没问题(在一个简单的存储过程中试过),但是一放到我做的存储过程就报错(存储过程在sqlserver的查询分析器中运行没问题),但是放到页面里提示是“java.sql.SQLException: [Microsoft][ODBC SQL Server Driver][SQL Server]形式参数 ′@waretype′ 定义为 OUTPUT,但实际参数却未声明为 OUTPUT。”但是我把◎waretype setstring以后,又提示我下一个要这样。不知是什么原因,请各位帮帮我。谢谢!!!
CallableStatement cs=con1.prepareCall("{call pro_Query(?,?,?,?,?,?,?,?,?,?)}");
cs.registerOutParameter(1,java.sql.Types.CHAR);
cs.setString(4,"PNP9000199");
cs.executequery();
String s1=cs.getString(1);
这是我在网页中调用存储过程的语句,请问是否正确?
总是提示我实参未声明output
...全文
912 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
软若石 2006-04-12
  • 打赏
  • 举报
回复
en
xingbozy 2006-03-10
  • 打赏
  • 举报
回复
mark
windtree 2006-03-09
  • 打赏
  • 举报
回复
大家好,感谢大家对我的帮助,终于做通了,谢谢大家,在此特别感谢TONYBLARED(奔放的犀牛) ,doway(john),zhh1981(**的猪头)等等好心人。。。。。


散分喽!!!!!!!
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
您好,doway(john):
还请您多指教,我第一次用java调用存储过程,只看了一些大概,对他不是很明了,由于库存查询的代码完成只有俩天时间,存储过程和数据库又不是我写的,所以在这里出丑了,还望您多指教。
在此也多谢doway(john)以及回帖的各位!!!
dewdrop 2006-03-08
  • 打赏
  • 举报
回复
@warenum varchar(50) out,//这句不要out

cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉

这样试试呢?
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
请问大家谁能给我一段代码,我自己研究也可以。先谢谢了!!!
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
请大家帮我看看,多多指教,谢谢了!!!
TONYBLARED 2006-03-08
  • 打赏
  • 举报
回复
我来跟yuchenjushi同学讨论吧.
你这个问题我斟酌了一下,觉得有两个地方是关键.
首先,存储过程是怎么写的,怎么用的你要明白.为了解决这个问题,我在本机操作了一下.
环境sqlserver2000.
1.建表
create table tonyProducts(
mingcheng varchar(20),
xinghao varchar(10),
guige varchar(10),
miaoshu varchar(20),
pici varchar(4),
qichu varchar(2),
yixiajia varchar(2),
zhuangtai varchar(10),
danwei varchar(4),
weizhi varchar(3)
)
2.插数据
insert into tonyProducts values('chocolate','PNP9000199','24G×10','f1','2006','10','16','in','pack','c1')
insert into tonyProducts values('icecream','PNP9000198','24G×20','f2','2005','20','26','out','box','c2')
insert into tonyProducts values('melon','PNP9000197','24G×30','f3','2004','30','36','way','bund','c3')
insert into tonyProducts values('sugar','PNP9000196','24G×40','f4','2003','40','46','crupt','bott','c4')
insert into tonyProducts values('icecream','PNP9000195','24G×50','f5','2002','50','56','out','cup','c5')
insert into tonyProducts values('pie','PNP9000194','24G×60','f6','2001','60','66','way','cup','c6')
insert into tonyProducts values('chocolate','PNP9000193','24G×70','f7','2000','70','76','in','box','c7')
insert into tonyProducts values('pie','PNP9000192','24G×80','f8','1999','80','86','out','pile','c8')

3.建立存储过程
CREATE proc pro_Query
@mingcheng varchar(20) = null,
@xinghao varchar(10) = null,
@guige varchar(10) = null,
@miaoshu varchar(20) = null,
@pici varchar(4) = null,
@qichu varchar(2) = null,
@yixiajia varchar(2) = null,
@zhuangtai varchar(10) = null,
@danwei varchar(4) = null,
@weizhi varchar(3) = null
as
select * from tonyProducts
where
mingcheng like isnull(@mingcheng,'%')
and xinghao like isnull(@xinghao,'%')
and guige like isnull(@guige,'%')
and miaoshu like isnull(@miaoshu,'%')
and pici like isnull(@pici,'%')
and qichu like isnull(@qichu,'%')
and yixiajia like isnull(@yixiajia,'%')
and zhuangtai like isnull(@zhuangtai,'%')
and danwei like isnull(@danwei,'%')
and weizhi like isnull(@weizhi,'%')

建立存储过程要特别说明一下,我这写的存储过程跟你的不一样.但是原理上是达到了你所言的"他可以接受十个参数中的任意一个作为查询条件,然后返回一个结果集".

4.在查询分析器中使用pro_Query
例子1:exec pro_Query,此操作返回所有.
例子2:exec pro_Query 'chocolate',此操作返回mingcheng是"chocolate"的所有结果.
例子3:exec pro_Query null,'PNP9000199',此操作返回xinghao是"PNP9000199"的所有结果.
例子4:exec pro_Query null,null,null,null,null,null,null,null,null,'c8',此操作返回weizhi是"c8"的所有结果.
声明:在查询分析器里使用存储过程有两种方式,一是按位置传递参数,如上者.二是按参数传递参数.以此来证明存储过程的正确性.

存储过程创建完毕,接着在程序里面引用.为了一一对应,我写了四个函数.
/*
* 对应例子1
*/
public static void procedureResultSet4() {
try {
System.out.println("in procedureResultSet4()");
Connection conn = JDBC_ODBC.getConnection();
String call = "{call pro_Query}";
CallableStatement cs = conn.prepareCall(call);
ResultSet rs = cs.executeQuery();
while (rs.next()) {
int index = 1;
while(index <= 9){
//格式化输出.
System.out.print(rs.getString(index++)+",");
}
System.out.println(rs.getString(index));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/*
* 对应例子2
*/
public static void procedureResultSet5() {
try {
System.out.println("in procedureResultSet5()");
Connection conn = JDBC_ODBC.getConnection();
String call = "{call pro_Query(?)}";
CallableStatement cs = conn.prepareCall(call);
cs.setString(1,"chocolate");
ResultSet rs = cs.executeQuery();
while (rs.next()) {
int index = 1;
while(index <= 9){
//格式化输出.
System.out.print(rs.getString(index++)+",");
}
System.out.println(rs.getString(index));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/*
* 对应例子3
*/
public static void procedureResultSet6() {
try {
System.out.println("in procedureResultSet6()");
Connection conn = JDBC_ODBC.getConnection();
String call = "{call pro_Query(?,?)}";
CallableStatement cs = conn.prepareCall(call);
cs.setString(1,null);
cs.setString(2,"PNP9000199");
ResultSet rs = cs.executeQuery();
while (rs.next()) {
int index = 1;
while(index <= 9){
//格式化输出.
System.out.print(rs.getString(index++)+",");
}
System.out.println(rs.getString(index));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}


/*
* 对应例子4
*/
public static void procedureResultSet7() {
try {
System.out.println("in procedureResultSet7()");
Connection conn = JDBC_ODBC.getConnection();
String call = "{call pro_Query(?,?,?,?,?,?,?,?,?,?)}";
CallableStatement cs = conn.prepareCall(call);
cs.setString(1,null);
cs.setString(2,null);
cs.setString(3,null);
cs.setString(4,null);
cs.setString(5,null);
cs.setString(6,null);
cs.setString(7,null);
cs.setString(8,null);
cs.setString(9,"box");
cs.setString(10,null);
ResultSet rs = cs.executeQuery();
while (rs.next()) {
int index = 1;
while(index <= 9){
//格式化输出.
System.out.print(rs.getString(index++)+",");
}
System.out.println(rs.getString(index));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

到此,程序书写完毕.如果你能够在控制台上得到的结果集与你在查询分析器中的结果一样时,恭喜你,你成功了.如果没有,请检查程序,检查存储过程.
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
请问您说的返回行的函数是什么意思,是不是就是指可以提取行记录呢,方法我不太懂,你能否给我一段代码我读读,谢谢!!!
doway 2006-03-08
  • 打赏
  • 举报
回复
这就不需要输出参数。

楼主 GOOGLE:jdbc 存储过程 sql server

保证有大把的内容。
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
请问是怎么回事呀,我现在是有点晕了。是这样的,我在数据库中定义了一个存储过程。他可以接受十个参数中的任意一个作为查询条件,然后返回一个结果集,里面包含了这个货物的名称,型号等10个货物信息,我现在只是想得到这个结果集,把他提取出来。请问应该如何作呢
xiongbing528 2006-03-08
  • 打赏
  • 举报
回复
楼主好象没理解存储过程的作用
yuchenjushi 2006-03-08
  • 打赏
  • 举报
回复
我试了,把@warenum varchar(50) out,//这句不要out

cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉

也不行,请问谁知道是怎么回事亚,还望各位大侠多多帮助!!!
doway 2006-03-08
  • 打赏
  • 举报
回复
SQL Server 的存储过程可以返回结果集。因此,对于下表:

名称 型号 规格 描述 批次 期初 以下架 货物状态 计量单位 存储位置
巧可力 PNP9000199 24G×80 食品 2006 10 6 出库 箱 c3

如果楼主是想根据型号“PNP9000199”返回一行的数据,根本就不需要输出参数。就是在 Oracle 中也不能那样写,而应使用返回行的函数。
执假以为真 2006-03-07
  • 打赏
  • 举报
回复
关注
doway 2006-03-07
  • 打赏
  • 举报
回复
PROCEDURE proc_get_sysmenu(
pUserid INT, -- 用户ID
pLayerLevel INT, -- 菜单级别
pParent varchar2, -- 上级编码
isAllotAuth varchar2, -- 是否用于权限分配 '1'-是
pOutRecSQL OUT varchar2);
pOutRecSQL OUT varchar2------这个就是标记为output的

CallableStatement cs=con1.prepareCall("{call pro_Query(?,?,?,?,?)}"); // 数要数对,几个参数就几个问号。
cs.registerOutParameter(5, java.sql.Types.VARCHAR); // 这个数也数错了,第五个参数才是输出参数。
cs.setString(4,"PNP9000199");
... // 这里其他的参数也需要设置。
cs.executequery(); // 这个方法大小写也不对。
String s1=cs.getString(5); // 这个数也不可以数错,应该差不多了。 :)
jordan1 2006-03-07
  • 打赏
  • 举报
回复
up 一下!
fjm_520 2006-03-07
  • 打赏
  • 举报
回复
学习中
wmzsl 2006-03-07
  • 打赏
  • 举报
回复
来晚了哈:) 顶一下
qingzhuang 2006-03-07
  • 打赏
  • 举报
回复
去看本书
加载更多回复(15)

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧