我用executeQuery执行时提示上面的错,但是只有一个输出参数的话,就没问题。我用execute执行时:ca.getObject(1);这地方报“无效的列类型”应该是没有返回的结果集出这个错。。我想用下面的hibernate的createQuery来执行。但是SQLquery没有registerOutParameter这个方法怎么办?求救大神,,怎么才能调用存储过程带输入输出参数返回结果集???
附上存储过程代码:
procedure system_test(
p_id in varchar2,
p_name in varchar2,
p_cursor out cursortype
) is
begin
open p_cursor for
select p_id ,p_name from dual;
end system_test;
java调用存储过程带输入输出参数
答案:2 悬赏:70 手机版
解决时间 2021-02-24 12:48
- 提问者网友:太高姿态
- 2021-02-23 22:04
最佳答案
- 五星知识达人网友:七十二街
- 2021-02-23 22:46
JDBC调用存储过程: CallableStatement
在Java里面调用存储过程,写法那是相当的固定:
Class.forName(....
Connection conn = DriverManager.getConnection(....
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three = cstmt.getInt(3);
System.out.println(three);
//把第4个参数的值当成int类型拿出来
int four = cstmt.getInt(4);
System.out.println(four);
//用完别忘给人家关了,后开的先关
cstmt.close();
conn.close();
JDBC调用存储过程,掌握这一个程序足够了.
以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.
create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp + 1;
end;
在Java里面调用存储过程,写法那是相当的固定:
Class.forName(....
Connection conn = DriverManager.getConnection(....
CallableStatement cstmt = conn.prepareCall("{call p(?,?,?,?)}");
cstmt.registerOutParameter(3, Types.INTEGER);
cstmt.registerOutParameter(4, Types.INTEGER);
cstmt.setInt(1, 3);
cstmt.setInt(2, 4);
cstmt.setInt(4, 5);
//执行
cstmt.execute();
//把第3个参数的值当成int类型拿出来
int three = cstmt.getInt(3);
System.out.println(three);
//把第4个参数的值当成int类型拿出来
int four = cstmt.getInt(4);
System.out.println(four);
//用完别忘给人家关了,后开的先关
cstmt.close();
conn.close();
JDBC调用存储过程,掌握这一个程序足够了.
以下是上面程序使用的存储过程的代码,我用的是Oracle数据库,不过不论是什么数据库,对于你的程序,JDBC这一端写法都是一样的.
create or replace procedure p
(v_a in number,v_b number,v_ret out number,v_temp in out number)
is
begin
if(v_a > v_b) then
v_ret := v_a;
else
v_ret := v_b;
end if;
v_temp := v_temp + 1;
end;
全部回答
- 1楼网友:一把行者刀
- 2021-02-23 23:35
1、创建带输出参数的存储过程 如: 在查询分析器中执行declare @mg nvarchar(100)
exec proc_csco_salesfctbystore 100,200,'name',@mg output
print @mg 在java中调用import java.sql.*;
public class test{
public static void main(string args[]) throws exception {//加载驱动drivermanager.registerdriver(new sun.jdbc.odbc.jdbcodbcdriver()); //获得连接
connection conn = drivermanager.getconnection("jdbc:odbc:mydata", "sa",""); //创建存储过程的对象
callablestatement c = conn.preparecall("{call proc_csco_salesfctbystore(?,?,?,?)}"); //给存储过程的第一个参数设置值
c.setint(1, 100); //给存储过程的第一个参数设置值
c.setint(2, 10000); //给存储过程的第一个参数设置值
c.setstring(3, user); //注册存储过程的第四个参数
c.registeroutparameter(4, java.sql.types.varchar); //执行存储过程
c.execute(); //得到存储过程的输出参数值
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯