我用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
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
pLayerLevel INT, -- 菜单级别
pParent varchar2, -- 上级编码
isAllotAuth varchar2, -- 是否用于权限分配 '1'-是
pOutRecSQL OUT varchar2);
pOutRecSQL OUT varchar2------这个就是标记为output的
既然这样设定了就要在过程中在相应的参数设为OUT的
cs.executeUpdate();或是cs.execute();就报错了,错误是
java.sql.SQLException: [Microsoft][ODBC SQL Server Driver]COUNT 字段不正确或语法错误
请问怎么办呀???
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); // 这个数也不可以数错,应该差不多了。 :)
/**
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();
}
}
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请大家帮忙看看哪里不对呀,先谢谢了
还请您多指教,我第一次用java调用存储过程,只看了一些大概,对他不是很明了,由于库存查询的代码完成只有俩天时间,存储过程和数据库又不是我写的,所以在这里出丑了,还望您多指教。
在此也多谢doway(john)以及回帖的各位!!!
巧可力 PNP9000199 24G×80 食品 2006 10 6 出库 箱 c3如果楼主是想根据型号“PNP9000199”返回一行的数据,根本就不需要输出参数。就是在 Oracle 中也不能那样写,而应使用返回行的函数。
你这个问题我斟酌了一下,觉得有两个地方是关键.
首先,存储过程是怎么写的,怎么用的你要明白.为了解决这个问题,我在本机操作了一下.
环境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();
}
}到此,程序书写完毕.如果你能够在控制台上得到的结果集与你在查询分析器中的结果一样时,恭喜你,你成功了.如果没有,请检查程序,检查存储过程.
散分喽!!!!!!!