F*******n 发帖数: 89 | 1 Hi,
我现在做一个project。源代码丢在办公室的电脑上了。今天贴不了。
我的Java程序中connect到一个database,然后执行另外一个同学写的stored
procedure。这个stored procedure是update这个database中的一个table的。可是这个
stored procedure怎么也不work。而且也没有给出来任何出错信息。
用我的程序可以执行其他的query和stored procedure 的query(只要没有update的都
可以)。我确定这个也不是权限问题。
请问Java在执行一些有update的stored procedure是不是有些trick呢?谢谢大虾们指
点。 |
A**o 发帖数: 1550 | 2 1, make sure you understand what's the expected result
2. excute the stored procedure using sql tools, check if it works at all
3. check your jdbc grammer, and intercept your jdbc call to the db
and check against what you have in 2
【在 F*******n 的大作中提到】 : Hi, : 我现在做一个project。源代码丢在办公室的电脑上了。今天贴不了。 : 我的Java程序中connect到一个database,然后执行另外一个同学写的stored : procedure。这个stored procedure是update这个database中的一个table的。可是这个 : stored procedure怎么也不work。而且也没有给出来任何出错信息。 : 用我的程序可以执行其他的query和stored procedure 的query(只要没有update的都 : 可以)。我确定这个也不是权限问题。 : 请问Java在执行一些有update的stored procedure是不是有些trick呢?谢谢大虾们指 : 点。
|
F*******n 发帖数: 89 | 3 谢谢。这个stored procedure肯定是work的。用sql tool试验过的,没有问题。
我也很清楚expected的result。
我的database call也没有grammer问题。
【在 A**o 的大作中提到】 : 1, make sure you understand what's the expected result : 2. excute the stored procedure using sql tools, check if it works at all : 3. check your jdbc grammer, and intercept your jdbc call to the db : and check against what you have in 2
|
c*****t 发帖数: 1879 | 4
你是指
select foo ();
工作,还是
insert table values (foo ());
工作,还是
update table set col = foo () where col = ...;
工作?
stored procedure 没写好的话,是可以出现前两个“工作”,但是到 update
的时候出问题的情形。比如,foo () 的结果是一 complex data structure,
这个 data structure 可能写的人没注意,只是 memory resident 的。但是
存到硬盘的结够必须是另外一种形式(比如 size header 等),因为有些
database 出于 performance 的考虑,所有的 in-memory data structure
得和硬盘 上的结构一一对应,并不提供 I/O wrapper 。这样的话,
in memory operation 是可以工作的。但是 store / load 在 database 里的
只是 memory pointer,没有实际的
【在 F*******n 的大作中提到】 : 谢谢。这个stored procedure肯定是work的。用sql tool试验过的,没有问题。 : 我也很清楚expected的result。 : 我的database call也没有grammer问题。
|
g*****g 发帖数: 34805 | 5 Not sure if this is the problem.
When using insert/delete/update, you should use
Statement.executeUpdate
【在 F*******n 的大作中提到】 : 谢谢。这个stored procedure肯定是work的。用sql tool试验过的,没有问题。 : 我也很清楚expected的result。 : 我的database call也没有grammer问题。
|
z***h 发帖数: 405 | 6 use CallableStatement for stored procedure
【在 g*****g 的大作中提到】 : Not sure if this is the problem. : When using insert/delete/update, you should use : Statement.executeUpdate
|
F*******n 发帖数: 89 | 7 谢谢goodbug大牛回帖。
我之前也试过exectuteUpdate,也不行。
【在 g*****g 的大作中提到】 : Not sure if this is the problem. : When using insert/delete/update, you should use : Statement.executeUpdate
|
F*******n 发帖数: 89 | 8 这个我也试过了,CallableStatement, PreparedStatement都试过了。
我明天不source code贴这里。请大家指点吧。
【在 z***h 的大作中提到】 : use CallableStatement for stored procedure
|
|
z***h 发帖数: 405 | 9 stored procedure 好像只能用 CallableStatement
贴出来看看
【在 F*******n 的大作中提到】 : 这个我也试过了,CallableStatement, PreparedStatement都试过了。 : 我明天不source code贴这里。请大家指点吧。
|
z***h 发帖数: 405 | 10 an example
String strStoredProcedure = "{ call your_procedure_name (?,?) }";
// Connection conn = getConnection(); //get your DB connection
CallableStatement cstmt = conn.prepareCall(strStoredProcedure);
cstmt.setString(1, strValue1);
cstmt.setString(2, strValue2);
cstmt.executeUpdate();
//or ResultSet rs = executeQuery();//if you expect output
【在 F*******n 的大作中提到】 : 这个我也试过了,CallableStatement, PreparedStatement都试过了。 : 我明天不source code贴这里。请大家指点吧。
|
|
|
F*******n 发帖数: 89 | 11 source code在这里:
try {
CallableStatement stmt = null;
String sql = "";
sql = "{ call usp_setBmtype(?, ?); }";
stmt = this.conn.prepareCall(sql);
stmt.setString(1, "null");
stmt.setInt(2, new Integer(0));
System.out.println("sql=" + sql);
stmt.execute();//stmt.executeUpdate();
stmt.close();
} catch (SQLException se) {
result = false;
se.printStackTrace();
try {
【在 z***h 的大作中提到】 : stored procedure 好像只能用 CallableStatement : 贴出来看看
|
s***e 发帖数: 122 | 12 stmt.setString(1, "null")的意图是?一个null字符串还是一个内容为"null"的字符
串?
【在 F*******n 的大作中提到】 : source code在这里: : try { : CallableStatement stmt = null; : String sql = ""; : sql = "{ call usp_setBmtype(?, ?); }"; : stmt = this.conn.prepareCall(sql); : stmt.setString(1, "null"); : stmt.setInt(2, new Integer(0)); : System.out.println("sql=" + sql); : stmt.execute();//stmt.executeUpdate();
|
F*******n 发帖数: 89 | 13 null是一个内容为 “null”的字符串.
【在 s***e 的大作中提到】 : stmt.setString(1, "null")的意图是?一个null字符串还是一个内容为"null"的字符 : 串?
|
z***h 发帖数: 405 | 14 it's a String, "null"
if you want to set to null, us
stmt.setNull(1,Types.VARCHAR);
【在 s***e 的大作中提到】 : stmt.setString(1, "null")的意图是?一个null字符串还是一个内容为"null"的字符 : 串?
|
z***h 发帖数: 405 | 15
remove ";" inside sql String
make sure you are passing a String "null", not a null value
and inside your stored procedure, try to set default value if passing in
null for an argument
you might want to post the stored procedure code here too.
use stmt.executeUpdate();
【在 F*******n 的大作中提到】 : source code在这里: : try { : CallableStatement stmt = null; : String sql = ""; : sql = "{ call usp_setBmtype(?, ?); }"; : stmt = this.conn.prepareCall(sql); : stmt.setString(1, "null"); : stmt.setInt(2, new Integer(0)); : System.out.println("sql=" + sql); : stmt.execute();//stmt.executeUpdate();
|
F*******n 发帖数: 89 | 16 good point。我周一就试试看。
我会把结果update在这里。
谢谢。
【在 z***h 的大作中提到】 : it's a String, "null" : if you want to set to null, us : stmt.setNull(1,Types.VARCHAR);
|
B*****g 发帖数: 34098 | 17 你用啥数据库?
【在 F*******n 的大作中提到】 : good point。我周一就试试看。 : 我会把结果update在这里。 : 谢谢。
|
w******n 发帖数: 692 | 18 Maybe you could run the stored procedure through sqlplus. If failed and you
have the source code of the stored procedure, You may add some DBMS_OUTPUT
there to debug the stored procedure.
【在 F*******n 的大作中提到】 : Hi, : 我现在做一个project。源代码丢在办公室的电脑上了。今天贴不了。 : 我的Java程序中connect到一个database,然后执行另外一个同学写的stored : procedure。这个stored procedure是update这个database中的一个table的。可是这个 : stored procedure怎么也不work。而且也没有给出来任何出错信息。 : 用我的程序可以执行其他的query和stored procedure 的query(只要没有update的都 : 可以)。我确定这个也不是权限问题。 : 请问Java在执行一些有update的stored procedure是不是有些trick呢?谢谢大虾们指 : 点。
|
h****n 发帖数: 101 | |
z***h 发帖数: 405 | 20 估计是解决了
【在 h****n 的大作中提到】 : lz问题解决了吗
|
|
|
F*******n 发帖数: 89 | 21 是sybase。
【在 B*****g 的大作中提到】 : 你用啥数据库?
|
F*******n 发帖数: 89 | 22 还没有。今天刚从外地玩回来,还没有去办公室。
明天去试试看。我有结果肯定会来update的。
谢谢。
【在 h****n 的大作中提到】 : lz问题解决了吗
|
F*******n 发帖数: 89 | 23 问题解决了。
这个store procedure里面既有select,也有update,所以不能有executeUpdate,只能
有execute。
问题出在在store procedure有多个results。
之前我没有capture这些results,结果就不行。
修改后把所有的results都capture了,结果我想要的结果就出来了。
那位大侠解释解释?
【在 z***h 的大作中提到】 : 估计是解决了
|
s***e 发帖数: 122 | 24 存储过程的原型是怎么声明的?它有多个results是说它还有多个out参数么?
【在 F*******n 的大作中提到】 : 问题解决了。 : 这个store procedure里面既有select,也有update,所以不能有executeUpdate,只能 : 有execute。 : 问题出在在store procedure有多个results。 : 之前我没有capture这些results,结果就不行。 : 修改后把所有的results都capture了,结果我想要的结果就出来了。 : 那位大侠解释解释?
|
B*****g 发帖数: 34098 | 25 I guess so.
Just can not believe missing parameters and there is no error.
But if the 2 parameters in original code include out parameters, code should
get the expected results even not set them to out parameters.
confused.
【在 s***e 的大作中提到】 : 存储过程的原型是怎么声明的?它有多个results是说它还有多个out参数么?
|
g*****g 发帖数: 34805 | 26 When you call excuteUpdate, you can't get resultset, I guess that's
the problem.
should
【在 B*****g 的大作中提到】 : I guess so. : Just can not believe missing parameters and there is no error. : But if the 2 parameters in original code include out parameters, code should : get the expected results even not set them to out parameters. : confused.
|
B*****g 发帖数: 34098 | 27 tested in oracle, excuteUpdate can get returned result.
【在 g*****g 的大作中提到】 : When you call excuteUpdate, you can't get resultset, I guess that's : the problem. : : should
|
h****n 发帖数: 101 | 28
回头试一下子,至少update听起来无需返回一个resultset……
【在 B*****g 的大作中提到】 : tested in oracle, excuteUpdate can get returned result.
|
s******e 发帖数: 493 | 29 excuteUpdate will only return the number of rows impacted. if you want to
use out parameter, you have to register it before you send the call. waht
kind of resultset were you talking about.
In your case, execute or executeupdate should not make any difference, if
you do not expect some int from your sp and there is no error thrown from
your sp. |