CallableStatement cstmt = conn.prepareCall("{?=call client_no(?,?)}");
cstmt.registerOutParameter(1,Types.VARCHAR,n);
cstmt.setString(2,"1203");
cstmt.execute();
////////////////////////////////////////////////
2、cstmt.registerOutParameter(1,Types.VARCHAR,n);
和
cstmt.setString(2,"1203");
到底有什么区别?你的第一个参数是调用存储过程返回的结果,cstmt.registerOutParameter(1,Types.VARCHAR,n);是声明其对象类型是返回varchar字符串类型
cstmt.setString(2,"1203");是设置存储过程调用参数(第一个),和普通的查询没有什么不同我认为你的程序报错,是因为没有设定调用存储过程的第二个参数所至
添加cstmt.setString(3,"22");//后面的字符串随你的需要,赋""也行
cstmt.registerOutParameter(1,Types.VARCHAR,n);
cstmt.setString(2,"1203");
cstmt.execute();
////////////////////////////////////////////////
2、cstmt.registerOutParameter(1,Types.VARCHAR,n);
和
cstmt.setString(2,"1203");
到底有什么区别?你的第一个参数是调用存储过程返回的结果,cstmt.registerOutParameter(1,Types.VARCHAR,n);是声明其对象类型是返回varchar字符串类型
cstmt.setString(2,"1203");是设置存储过程调用参数(第一个),和普通的查询没有什么不同我认为你的程序报错,是因为没有设定调用存储过程的第二个参数所至
添加cstmt.setString(3,"22");//后面的字符串随你的需要,赋""也行
你的("{?=call client_no(?,?)}");这个调用有3个?
所以我想上面应该是传递给存储过程的第一个参数,第二个参数没有传入,故报类型错误
("{?=call client_no(?,?)}");我刚才查到一片资料
说?=表示有返回值的参数,我这样写,是表示有3个参数吗?是这样吗?
另一个是 in out
我的("{?=call client_no(?,?)}");这样写对吗?
"?"到底怎么和我的存储过程重参数对应?
给你些语句参考:
//准备SQL语句
strSQL = "{call sp_jsptest(?,?)}";
//准备可调用语句对象
sqlStmt = sqlCon.prepareCall(strSQL);
//设置输入参数
sqlStmt.setString(1,strName);
//登记输出参数
sqlStmt.registerOutParameter(2,java.sql.Types.Array);
//执行该存储过程并返回结果集
sqlRst = sqlStmt.executeQuery();
//获取来自结果集中的数据
sqlRst.next();
strWelcome = sqlRst.getString(1);
//获取输出参数的值
java.sql.Array strMyName = sqlStmt.getString(2);
CallableStatement cstmt = conn.prepareCall("{call client_no(?,?)}");
cstmt.setString(1,"1203");
cstmt.registerOutParameter(2,Types.VARCHAR);
cstmt.execute();
String str = sqlStmt.getString(2);
看看str是否能正常接收到存储过程的输出参数(就是第二个)
确实有这样的("{?=call client_no(?,?)}");形式
大致意思是存储过程有返回值时要用这样的形式,不过这些资料好像
说得概念也不太清楚,我再试试!
非常感谢
你此处需要调用的是存储过程procedure……
毕竟我没有尝试过("{?=call client_no(?,?)}");这样调用的说
如果网上有实例,那么应该是可以的说
参考看看:
http://class.gzrail.net/read.php?classid=140
我试了CallableStatement cstmt = conn.prepareCall("{call client_no(?,?)}"); , 其实也可以返回值,多谢你的帮助!
下面是我看到的资料,但是我没能是成功,多半是我还没有理解("{?=call client_no(?,?)}");的使用方法.
再一次感谢!
http://www.fanqiang.com/a4/b5/20010530/180801279.html
ATCG
cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
cstmt .setString(2,"sdfa");
cstmt .setInt(3,2);
cstmt .executeUpdate();
result = cstmt .getString(1);是这么用的,我的运行正常.
谢谢!能解释一下每句的含义吗?你的程序里有三个“?"
?= 是不是对应 1,若我的存储过程有两个参数,其中一个是IN,另一个
是INOUT的,那么你的程序的 ? 应该怎么和我的存储过程的参数来对应呢?
谢谢!
cstmt = conn.prepareCall("{call client_no (?,?)}");
cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
cstmt .setString(2,"sdfa");
cstmt .executeUpdate();
result = cstmt .getString(1);
cstmt = conn.prepareCall("{?=call client_no (?,?)}");
1 2 3是这样吗?按照下面的写法不也是可以取得返回值吗?
cstmt = conn.prepareCall("{call client_no (?,?)}");
cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
cstmt .setString(2,"sdfa");
cstmt .executeUpdate();
result = cstmt .getString(1);这两者有什么区别?
其中function是通过第一种方式获取返回值:
?=call client_no (?,?)。
因为function的是通过return语句返回结果的。
而procedure是没有return语句的。因此只有通过out类型的参数来返回结果,但通过这种方式可以返回多个结果(多定义几个out参数就可以),这是function不能实现的。
因此procedure的调用就是通过call client_no (?,?)。所以再调用存储过程前先要了解它的具体类型。