当前位置: 技术问答>java相关
关于java调用oracle存储过程的问题,谢谢!
来源: 互联网 发布时间:2017-03-11
本文导语: 1、我有一张表,只有一个字段 id varchar2(6) 有个ORACLE存储过程,有两个参数, aa in varchar2 -- 代表id 的前4个字符 bb in out varchar2 -- 代表id 的后2个字符 现有一段java程序,想调用存储过...
1、我有一张表,只有一个字段 id varchar2(6)
有个ORACLE存储过程,有两个参数,
aa in varchar2 -- 代表id 的前4个字符
bb in out varchar2 -- 代表id 的后2个字符
现有一段java程序,想调用存储过程,不知道
下面这段程序错在哪里?错误提示:
错误.executeQuery:参数类型冲突: sqlType=12
n 的值是"00"
public String executeQuery(String n)
{
try
{
conn = ... //省略了数据库连接等语句
CallableStatement cstmt = conn.prepareCall("{?=call client_no(?,?)}");
cstmt.registerOutParameter(1,Types.VARCHAR,n);
cstmt.setString(2,"1203");
cstmt.execute();
n = cstmt.getString(1);
}
catch(SQLException ex)
{System.err.println("错误.executeQuery:"+ex.getMessage());}
return n;
}
2、cstmt.registerOutParameter(1,Types.VARCHAR,n);
和
cstmt.setString(2,"1203");
到底有什么区别?
3、cstmt.setString(2,"1203"); “2”表示是传给存储过程的第二个参数吗?
有个ORACLE存储过程,有两个参数,
aa in varchar2 -- 代表id 的前4个字符
bb in out varchar2 -- 代表id 的后2个字符
现有一段java程序,想调用存储过程,不知道
下面这段程序错在哪里?错误提示:
错误.executeQuery:参数类型冲突: sqlType=12
n 的值是"00"
public String executeQuery(String n)
{
try
{
conn = ... //省略了数据库连接等语句
CallableStatement cstmt = conn.prepareCall("{?=call client_no(?,?)}");
cstmt.registerOutParameter(1,Types.VARCHAR,n);
cstmt.setString(2,"1203");
cstmt.execute();
n = cstmt.getString(1);
}
catch(SQLException ex)
{System.err.println("错误.executeQuery:"+ex.getMessage());}
return n;
}
2、cstmt.registerOutParameter(1,Types.VARCHAR,n);
和
cstmt.setString(2,"1203");
到底有什么区别?
3、cstmt.setString(2,"1203"); “2”表示是传给存储过程的第二个参数吗?
|
Oracle中后台的存储过程就有fucntion(函数)和procedure(过程)之分。
其中function是通过第一种方式获取返回值:
?=call client_no (?,?)。
因为function的是通过return语句返回结果的。
而procedure是没有return语句的。因此只有通过out类型的参数来返回结果,但通过这种方式可以返回多个结果(多定义几个out参数就可以),这是function不能实现的。
因此procedure的调用就是通过call client_no (?,?)。。。。。。。
所以再调用存储过程前先要了解它的具体类型。
其中function是通过第一种方式获取返回值:
?=call client_no (?,?)。
因为function的是通过return语句返回结果的。
而procedure是没有return语句的。因此只有通过out类型的参数来返回结果,但通过这种方式可以返回多个结果(多定义几个out参数就可以),这是function不能实现的。
因此procedure的调用就是通过call client_no (?,?)。。。。。。。
所以再调用存储过程前先要了解它的具体类型。
|
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");//后面的字符串随你的需要,赋""也行
|
cstmt = conn.prepareCall("{?=call client_no (?,?)}");
cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
cstmt .setString(2,"sdfa");
cstmt .setInt(3,2);
cstmt .executeUpdate();
result = cstmt .getString(1);
是这么用的,我的运行正常.
cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
cstmt .setString(2,"sdfa");
cstmt .setInt(3,2);
cstmt .executeUpdate();
result = cstmt .getString(1);
是这么用的,我的运行正常.
|
我回答第三个问题
是的
是的