Java 使用jdbc从plsql获取sys游标时出错
我有一个返回sys_refcursor的存储过程,我正在尝试使用JDBC从java获取游标 plsql存储过程Java 使用jdbc从plsql获取sys游标时出错,java,stored-procedures,jdbc,plsql,oracle10g,Java,Stored Procedures,Jdbc,Plsql,Oracle10g,我有一个返回sys_refcursor的存储过程,我正在尝试使用JDBC从java获取游标 plsql存储过程 create or replace procedure my_proc(p_deptno IN number,p_emp_no IN varchar2 , p_cursor OUT SYS_REFCURSOR) is begin open p_cursor FOR select * from emp where deptno =
create or replace procedure my_proc(p_deptno IN number,p_emp_no IN varchar2
, p_cursor OUT SYS_REFCURSOR)
is
begin
open p_cursor FOR
select *
from emp
where deptno = p_deptno and emp_number=p_emp_no;
end proc;
/
java代码
callablestatement = connection.prepareCall("{cal my_proc(?,?,?)} ");
callablestatement.setInt(1, param1);
callablestatement.setString(2, param2);
callablestatement.registerOutParameter(3, OracleTypes.CURSOR);
callablestatement.execute();
resultSet = ((OracleCallableStatement)callablestatement).getCursor(4);
while (resultSet.next()) {
<classname> = mapList(resultSet);
logger.info(resultSet.getString(1));
}
及
使用CallableStatement.setObject(代替 的
.setString
和.setInt
等
它还有callablestatement.setNull表示null
但是保持registerOutParameter
相同
方法说明
使用给定对象设置指定参数的值
第二个参数必须是Object类型;因此,java.lang
内置类型应使用等效对象
规范指定了从Java对象类型到
SQL类型。给定的参数将转换为相应的
SQL类型。请注意,此方法可能会
用于通过使用
特定于驱动程序的Java类型。如果对象是实现
接口SQLData时,JDBC驱动程序应调用该方法
SQLData.writeSQL将其写入SQL数据流。如果
另一方面,对象属于实现Ref、Blob、Clob、NClob、,
结构、java.net.URL或数组,驱动程序应将其传递给
数据库作为相应SQL类型的值。此方法引发
如果存在歧义,例如,如果对象为
实现上述多个接口的类的。
注意:并非所有数据库都允许向
为了最大的可移植性,setNull或setObject(字符串
应使用parameterName、Object x、int sqlType)方法,而不是
setObject(字符串参数名称,对象x)
使用CallableStatement.setObject(
代替
的
.setString
和.setInt
等
它还有callablestatement.setNull表示null
但是保持registerOutParameter
相同
方法说明
使用给定对象设置指定参数的值
第二个参数必须是Object类型;因此,java.lang
内置类型应使用等效对象
规范指定了从Java对象类型到
SQL类型。给定的参数将转换为相应的
SQL类型。请注意,此方法可能会
用于通过使用
特定于驱动程序的Java类型。如果对象是实现
接口SQLData时,JDBC驱动程序应调用该方法
SQLData.writeSQL将其写入SQL数据流。如果
另一方面,对象属于实现Ref、Blob、Clob、NClob、,
结构、java.net.URL或数组,驱动程序应将其传递给
数据库作为相应SQL类型的值。此方法引发
如果存在歧义,例如,如果对象为
实现上述多个接口的类的。
注意:并非所有数据库都允许向
为了最大的可移植性,setNull或setObject(字符串
应使用parameterName、Object x、int sqlType)方法,而不是
setObject(字符串参数名称,对象x)
您的声明中有一个拼写错误:
{cal my_proc(?,?,?)}
应该是
{call my_proc(?,?,?)}
您的声明中有一个拼写错误:
{cal my_proc(?,?,?)}
应该是
{call my_proc(?,?,?)}
我已经通过使用与过程中代码相同的函数解决了问题,并且它已经解决了我的问题
我用下面的方式调用了我的函数
private final String FUNCTIONAME= "begin ? :=myfunc(?,?,?); end;"";
谢谢我已通过使用与过程中代码相同的函数解决了问题,它已解决了我的问题
我用下面的方式调用了我的函数
private final String FUNCTIONAME= "begin ? :=myfunc(?,?,?); end;"";
感谢callablestatement.execute();
感谢查看prepareCall
行。那应该是call my_proc
而不是callablestatement.execute()
谢谢看一看prepareCall
行。那应该是调用my_proc
而不是cal my_proc
?-1没有任何评论,我如何才能学会不犯同样的错误!!!请发布原因。我已经通过使用函数而不是过程来解决问题。我不是下一个投票人,但你可以编辑你你的回答并解释你所说的“代替”是什么意思。而不是…什么?-1没有评论我如何才能学会不犯同样的错误!!!请发布原因。我已经通过使用函数而不是过程来解决问题。我不是投票人,但你可以编辑你的回答并解释你所说的“代替”是什么意思。而不是…什么?我在stackoverflow.com上复制的时候是个打字错误。Thanks@Polappan你确定吗?因为你的问题中的错误信息中也包含了这个输入错误。当我在stackoverflow.com复制时,这是一个输入错误。Thanks@Polappan你确定吗?因为你的问题中的错误信息中也包含了打字错误。