Redian新闻
>
Java call stored procedure的一个问题
avatar
Java call stored procedure的一个问题# Java - 爪哇娇娃
F*n
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呢?谢谢大虾们指
点。
avatar
A*o
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呢?谢谢大虾们指
: 点。

avatar
F*n
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

avatar
c*t
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问题。

avatar
g*g
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问题。

avatar
z*h
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

avatar
F*n
7
谢谢goodbug大牛回帖。
我之前也试过exectuteUpdate,也不行。

【在 g*****g 的大作中提到】
: Not sure if this is the problem.
: When using insert/delete/update, you should use
: Statement.executeUpdate

avatar
F*n
8
这个我也试过了,CallableStatement, PreparedStatement都试过了。
我明天不source code贴这里。请大家指点吧。

【在 z***h 的大作中提到】
: use CallableStatement for stored procedure
avatar
z*h
9
stored procedure 好像只能用 CallableStatement
贴出来看看

【在 F*******n 的大作中提到】
: 这个我也试过了,CallableStatement, PreparedStatement都试过了。
: 我明天不source code贴这里。请大家指点吧。

avatar
z*h
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贴这里。请大家指点吧。

avatar
F*n
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
: 贴出来看看

avatar
s*e
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();

avatar
F*n
13
null是一个内容为 “null”的字符串.

【在 s***e 的大作中提到】
: stmt.setString(1, "null")的意图是?一个null字符串还是一个内容为"null"的字符
: 串?

avatar
z*h
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"的字符
: 串?

avatar
z*h
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();

avatar
F*n
16
good point。我周一就试试看。
我会把结果update在这里。
谢谢。

【在 z***h 的大作中提到】
: it's a String, "null"
: if you want to set to null, us
: stmt.setNull(1,Types.VARCHAR);

avatar
B*g
17
你用啥数据库?

【在 F*******n 的大作中提到】
: good point。我周一就试试看。
: 我会把结果update在这里。
: 谢谢。

avatar
w*n
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呢?谢谢大虾们指
: 点。

avatar
h*n
19
lz问题解决了吗
avatar
z*h
20
估计是解决了

【在 h****n 的大作中提到】
: lz问题解决了吗
avatar
F*n
21
是sybase。

【在 B*****g 的大作中提到】
: 你用啥数据库?
avatar
F*n
22
还没有。今天刚从外地玩回来,还没有去办公室。
明天去试试看。我有结果肯定会来update的。
谢谢。

【在 h****n 的大作中提到】
: lz问题解决了吗
avatar
F*n
23
问题解决了。
这个store procedure里面既有select,也有update,所以不能有executeUpdate,只能
有execute。
问题出在在store procedure有多个results。
之前我没有capture这些results,结果就不行。
修改后把所有的results都capture了,结果我想要的结果就出来了。
那位大侠解释解释?

【在 z***h 的大作中提到】
: 估计是解决了
avatar
s*e
24
存储过程的原型是怎么声明的?它有多个results是说它还有多个out参数么?

【在 F*******n 的大作中提到】
: 问题解决了。
: 这个store procedure里面既有select,也有update,所以不能有executeUpdate,只能
: 有execute。
: 问题出在在store procedure有多个results。
: 之前我没有capture这些results,结果就不行。
: 修改后把所有的results都capture了,结果我想要的结果就出来了。
: 那位大侠解释解释?

avatar
B*g
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参数么?
avatar
g*g
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.

avatar
B*g
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

avatar
h*n
28

回头试一下子,至少update听起来无需返回一个resultset……

【在 B*****g 的大作中提到】
: tested in oracle, excuteUpdate can get returned result.
avatar
s*e
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.
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。