java中如何调用sqlserver数据库中的自定义的存储过程???????
我用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
问题点数:100、回复次数:35Top
1 楼yuchenjushi(雨辰)回复于 2006-03-06 15:47:22 得分 0
请大家帮帮我吧,他提示我要我给每个参数声明output,请问到底是怎么回事呀Top
2 楼wilowind(杂而不精)回复于 2006-03-06 15:48:23 得分 0
顶下,学习中...Top
3 楼jfy3d(剑事 http://www.migti.com)回复于 2006-03-06 16:13:12 得分 0
你的存储过程里没有设置 OUTPUTTop
4 楼yuchenjushi(雨辰)回复于 2006-03-06 16:27:41 得分 0
哦,我得存储过程里没有设置output,请问是不是要设成output呀Top
5 楼zhh1981(**的猪头)回复于 2006-03-06 16:43:57 得分 0
PROCEDURE proc_get_sysmenu(pUserid INT, -- 用户ID
pLayerLevel INT, -- 菜单级别
pParent varchar2, -- 上级编码
isAllotAuth varchar2, -- 是否用于权限分配 '1'-是
pOutRecSQL OUT varchar2);
pOutRecSQL OUT varchar2------这个就是标记为output的Top
6 楼yuchenjushi(雨辰)回复于 2006-03-06 16:48:07 得分 0
请问你的意思是要在存储过程中,必须定义为output才行么Top
7 楼jfy3d(剑事 http://www.migti.com)回复于 2006-03-06 17:04:30 得分 5
没有output就把 cs.registerOutParameter(1,java.sql.Types.CHAR); 去掉Top
8 楼zhh1981(**的猪头)回复于 2006-03-06 17:21:32 得分 10
cs.registerOutParameter(1,java.sql.Types.CHAR);
既然这样设定了就要在过程中在相应的参数设为OUT的Top
9 楼yuchenjushi(雨辰)回复于 2006-03-06 23:38:15 得分 0
感谢jfy3d(剑事)还有zhh1981(**的猪头),谢谢你们的回帖,可是如果去掉了 cs.registerOutParameter(1,java.sql.Types.CHAR); 这句话,那我移植性一执行
cs.executeUpdate();或是cs.execute();就报错了,错误是
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误
请问怎么办呀???Top
10 楼doway(john)回复于 2006-03-07 00:11:46 得分 0
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); // 这个数也不可以数错,应该差不多了。 :)
Top
11 楼nirendao(雷老虎)回复于 2006-03-07 00:30:54 得分 0
关注Top
12 楼TONYBLARED(奔放的犀牛)回复于 2006-03-07 03:18:30 得分 0
楼主可适当参考如下解决方案:
/**
create procedure Battery_Order4
@shipName nvarchar(40) = NULL
as
if @shipName is null
return(1)
else
return(2)
**/
public static void procedureReturn() {
try {
Connection conn = JDBC_ODBC.getConnection();
System.out.println("conn is:" + conn);
String call = "{? = call Battery_Order4(?)}";
CallableStatement cs = conn.prepareCall(call);
cs.registerOutParameter(1, java.sql.Types.INTEGER); cs.setString(2, "Hanari Carnes");
cs.execute();
System.out.println(cs.getInt(1));
} catch (Exception ex) {
ex.printStackTrace();
}
}
/**
create procedure ShipVia_Sum
@via int,
@sum money output
as
select @sum = sum(freight) from orders
where shipVia = @via
**/
public static void procedureOutput() {
try {
Connection conn = JDBC_ODBC.getConnection();
System.out.println("conn is:" + conn);
String call = "{call ShipVia_Sum(?,?)}";
CallableStatement cs = conn.prepareCall(call);
cs.setInt(1, 1);
cs.registerOutParameter(2, java.sql.Types.DOUBLE);
cs.execute();
System.out.println(cs.getDouble(2));
} catch (Exception ex) {
ex.printStackTrace();
}
}Top
13 楼TONYBLARED(奔放的犀牛)回复于 2006-03-07 03:20:17 得分 0
以上是针对sqlserver数据库建立的存储过程,oracle中的应该类似吧,各数据库厂商提供的内部接口不一样,但是java访问方式几乎相同.个人看法.Top
14 楼wmzsl(王明哲)回复于 2006-03-07 09:05:14 得分 0
来晚了哈:) 顶一下Top
15 楼fjm_520(蓝)回复于 2006-03-07 09:50:35 得分 0
学习中Top
16 楼jordan1(班君)回复于 2006-03-07 10:54:05 得分 0
up 一下!Top
17 楼ssy8110(半只拖鞋)回复于 2006-03-07 15:24:51 得分 0
TONYBLARED(奔放的犀牛) 最全,顶Top
18 楼yuchenjushi(雨辰)回复于 2006-03-07 15:27:40 得分 0
首先感谢大家对我的帮助!可还是有一点不对,我是这样的,我在数据库中定义了一个存储过程。而且也都加上了out:
CREATE proc pro_Query
@do_jigou varchar(4) out,
@guest_jigou varchar(4) out,
@warename varchar(50) out,
@warenum varchar(50) out,
@waretype varchar(50) out,
@warebulk varchar(100) out,
@waremaketime varchar(100) out,
@warestate varchar(100) out,
@stocode varchar(20) out,
@GroupType varchar(100) out
这十个参数是可以作为条件选择查询的,下面是我的代码:
CallableStatement cs=con1.prepareCall("{call pro_Query(?,?,?,?,?,?,?,?,?,?)}");
cs.registerOutParameter(1,java.sql.Types.VARCHAR);
cs.registerOutParameter(2,java.sql.Types.VARCHAR);
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.registerOutParameter(4,java.sql.Types.VARCHAR);
cs.registerOutParameter(5,java.sql.Types.VARCHAR);
cs.registerOutParameter(6,java.sql.Types.VARCHAR);
cs.registerOutParameter(7,java.sql.Types.VARCHAR);
cs.registerOutParameter(8,java.sql.Types.VARCHAR);
cs.registerOutParameter(9,java.sql.Types.VARCHAR);
cs.registerOutParameter(10,java.sql.Types.VARCHAR);
cs.setString(4,"PNP9000199");
cs.execute();
System.out.println(cs.getString(2));//他却返回null
可是我在查询分析器中运行:exec pro_query'','','','PNP9000199','','','','','',''会得到这样一个结果集
名称 型号 规格 描述 批次 期初 以下架 货物状态 计量单位 存储位置
巧可力 PNP9000199 24G×80 食品 2006 10 6 出库 箱 c3
请大家帮忙看看哪里不对呀,先谢谢了Top
19 楼bohlee(我心澎湃)回复于 2006-03-07 15:51:35 得分 0
markTop
20 楼doway(john)回复于 2006-03-07 19:51:24 得分 0
胡搞。
楼主怕是不明白“输出”的含义。
Top
21 楼qingzhuang(半片云)回复于 2006-03-07 20:45:28 得分 0
去看本书Top
22 楼yuchenjushi(雨辰)回复于 2006-03-08 00:20:51 得分 0
您好,doway(john):
还请您多指教,我第一次用java调用存储过程,只看了一些大概,对他不是很明了,由于库存查询的代码完成只有俩天时间,存储过程和数据库又不是我写的,所以在这里出丑了,还望您多指教。
在此也多谢doway(john)以及回帖的各位!!!Top
23 楼doway(john)回复于 2006-03-08 01:11:35 得分 0
SQL Server 的存储过程可以返回结果集。因此,对于下表:
名称 型号 规格 描述 批次 期初 以下架 货物状态 计量单位 存储位置
巧可力 PNP9000199 24G×80 食品 2006 10 6 出库 箱 c3
如果楼主是想根据型号“PNP9000199”返回一行的数据,根本就不需要输出参数。就是在 Oracle 中也不能那样写,而应使用返回行的函数。
Top
24 楼yuchenjushi(雨辰)回复于 2006-03-08 08:12:55 得分 0
请问您说的返回行的函数是什么意思,是不是就是指可以提取行记录呢,方法我不太懂,你能否给我一段代码我读读,谢谢!!!Top
25 楼yuchenjushi(雨辰)回复于 2006-03-08 10:15:21 得分 0
请大家帮我看看,多多指教,谢谢了!!!Top
26 楼yuchenjushi(雨辰)回复于 2006-03-08 11:47:51 得分 0
请问大家谁能给我一段代码,我自己研究也可以。先谢谢了!!!Top
27 楼dewdrop(白露)回复于 2006-03-08 12:12:54 得分 0
@warenum varchar(50) out,//这句不要out
cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉
这样试试呢?Top
28 楼yuchenjushi(雨辰)回复于 2006-03-08 15:50:04 得分 0
我试了,把@warenum varchar(50) out,//这句不要out
cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉
也不行,请问谁知道是怎么回事亚,还望各位大侠多多帮助!!!
Top
29 楼xiongbing528(多情剑客无情剑)回复于 2006-03-08 16:31:05 得分 0
楼主好象没理解存储过程的作用Top
30 楼yuchenjushi(雨辰)回复于 2006-03-08 16:46:58 得分 0
请问是怎么回事呀,我现在是有点晕了。是这样的,我在数据库中定义了一个存储过程。他可以接受十个参数中的任意一个作为查询条件,然后返回一个结果集,里面包含了这个货物的名称,型号等10个货物信息,我现在只是想得到这个结果集,把他提取出来。请问应该如何作呢Top
31 楼doway(john)回复于 2006-03-08 17:24:51 得分 20
这就不需要输出参数。
楼主 GOOGLE:jdbc 存储过程 sql server
保证有大把的内容。
Top
32 楼TONYBLARED(奔放的犀牛)回复于 2006-03-08 20:19:58 得分 65
我来跟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();
}
}
到此,程序书写完毕.如果你能够在控制台上得到的结果集与你在查询分析器中的结果一样时,恭喜你,你成功了.如果没有,请检查程序,检查存储过程.Top
33 楼windtree(风树)回复于 2006-03-09 17:01:46 得分 0
大家好,感谢大家对我的帮助,终于做通了,谢谢大家,在此特别感谢TONYBLARED(奔放的犀牛) ,doway(john),zhh1981(**的猪头)等等好心人。。。。。
散分喽!!!!!!!Top
34 楼xingbozy(3951263)回复于 2006-03-10 09:11:39 得分 0
markTop
35 楼ruanruoshi(软若石)回复于 2006-04-12 15:58:59 得分 0
enTop
相关问题
- oracle存储过程中如何调用自定义的函数?
- 怎样在存储过程中调用自定义函数?
- command调用sqlserver存储过程问题
- 高手请进 特请邹大侠关注!关于存储过程中解析xml和存储过程调用自定义dll的问题!
- 怎么会是这样?(PB中调用SQL SERVER自定义存储过程的问题)
- 如何在Vb中调用sql的那些系统的和自定义的存储过程?
- 请问,自定义的函数。写在那里?? 再就是在什么地方运行? 可以在存储过程中调用自定义的函数吗?
- 我看了好多为了高效率分页都调用存储过程自定义分页。可我不想调用存储过程,有没有用代码(c#)的啊。非存储过程
- 存储过程调用存储过程
- 调用存储过程的一个怪问题(sqlserver)




