当前位置: 技术问答>java相关
java调用oracle存储过程的问题
来源: 互联网 发布时间:2017-04-24
本文导语: 我用的数据库是oracle 存储过程如下 CREATE OR REPLACE PROCEDURE "SP_WFSHWLUSERINFILE" ( Billid IN integer, Resulti OUT integer) AS BEGIN ....... COMMIT; Resulti:=0; EXCEPTIO...
我用的数据库是oracle
存储过程如下
CREATE OR REPLACE PROCEDURE "SP_WFSHWLUSERINFILE"
( Billid IN integer,
Resulti OUT integer)
AS
BEGIN
.......
COMMIT;
Resulti:=0;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
Resulti:=-1;
END;
java程序部分如下
int billid=1;
CallableStatement aStatement=null;
String SqlString="{?=call SP_WFSHWLUSERINFILE(?)}";
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(1,Types.INTEGER);
aStatement.setLong(2,billid);
aStatement.execute();
sqlCon是一个数据库的连接,但是这样就会报错
可是如果改为
int billid=1;
int result=0;
CallableStatement aStatement=null;
String SqlString="{call SP_WFSHWLUSERINFILE(?,?)}";
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(1,Types.VARCHAR);
aStatement.setLong(1,billid);
aStatement.setLong(2,result);
aStatement.execute();
这样存储过程就能执行了,可是这样result的值根本不会变,根本无法得到存储过程的返回值
我的问题是如何得到oracle存储过程中定义成OUT的返回参数值呢?
存储过程如下
CREATE OR REPLACE PROCEDURE "SP_WFSHWLUSERINFILE"
( Billid IN integer,
Resulti OUT integer)
AS
BEGIN
.......
COMMIT;
Resulti:=0;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
Resulti:=-1;
END;
java程序部分如下
int billid=1;
CallableStatement aStatement=null;
String SqlString="{?=call SP_WFSHWLUSERINFILE(?)}";
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(1,Types.INTEGER);
aStatement.setLong(2,billid);
aStatement.execute();
sqlCon是一个数据库的连接,但是这样就会报错
可是如果改为
int billid=1;
int result=0;
CallableStatement aStatement=null;
String SqlString="{call SP_WFSHWLUSERINFILE(?,?)}";
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(1,Types.VARCHAR);
aStatement.setLong(1,billid);
aStatement.setLong(2,result);
aStatement.execute();
这样存储过程就能执行了,可是这样result的值根本不会变,根本无法得到存储过程的返回值
我的问题是如何得到oracle存储过程中定义成OUT的返回参数值呢?
|
你的第一种用法实际上不是调用存储过程,而是调用oracle函数的用法;
第二种才是调用存储过程,但是有问题,改成这样试试:
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(2,Types.NUMBERRIC);//这里数字型是不是NUMBERRIC我记不请了,在编译器里应该会弹出帮助的
aStatement.setLong(1,billid);
aStatement.execute();
另外,存储过程的参数数字型最好不要用integer,数字型用number,或者就用varchar型,oracle会自动匹配为数字型的
第二种才是调用存储过程,但是有问题,改成这样试试:
aStatement=sqlCon.prepareCall(SqlString);
aStatement.registerOutParameter(2,Types.NUMBERRIC);//这里数字型是不是NUMBERRIC我记不请了,在编译器里应该会弹出帮助的
aStatement.setLong(1,billid);
aStatement.execute();
另外,存储过程的参数数字型最好不要用integer,数字型用number,或者就用varchar型,oracle会自动匹配为数字型的