gpt4 book ai didi

java - 使用PrepareCall方法将参数传递给函数并返回计数值

转载 作者:太空宇宙 更新时间:2023-11-04 13:48:12 25 4
gpt4 key购买 nike

我在 Oracle 中编写了一个函数,它接受一个参数并返回一个计数。存储过程的返回类型是数字。我使用Java中的PrepareCall方法调用该函数,

public static int checkPreviousLoad(int Id) { 
int countPrev = 0;
//Here we run the Function to get the existing count of to be loaded Id. try {
CallableStatement proc_stmt = connection.prepareCall(" {? = call F_CHK_PREVIOUSLOAD(?)}");
proc_stmt.setLong(1, Id);
// Register the type of the return value proc_stmt.registerOutParameter(1, OracleTypes.NUMBER);
// Execute and retrieve the returned value. proc_stmt.execute();
ResultSet rs = (ResultSet) proc_stmt.getObject(1);
rs.next();
countPrev = rs.getInt(1);
System.out.println("the count is: "+countPrev);
rs.close();
proc_stmt.close();
} catch(SQLException e) {
String temp = e.getMessage();
System.out
.println("ERROR: SQL Exception when executing F_CHK_PREVIOUSLOAD \n");
System.err.println("ERROR MESSAGE IS: " + temp);
System.err.println("SQLState: " + e.getSQLState());
}

return countPrev;
}`

这会引发 SQLException。

错误信息是这样的:错误:执行 F_CHK_PREVIOUSLOAD 时出现 SQL 异常

错误消息是:索引 2 处缺少 IN 或 OUT 参数SQL状态:空

请告诉我哪里出错了。谢谢。

最佳答案

  1. 您收到的错误是因为您注释掉了必要的 registerOutParameter() method ofCallableStatementinterface ,它将输出参数注册为其相应的类型。

  2. 此外,将输入参数更改为 2(因为它是准备好的语句中的参数号 2)。

并且,请不要将您的存储过程称为函数。

在将结果存储到 ResultSet 之前执行以下更改:-

CallableStatement proc_stmt = connection.prepareCall(" {? = call F_CHK_PREVIOUSLOAD(?)}");     
proc_stmt.registerOutParameter(1, OracleTypes.NUMBER);
proc_stmt.setLong(2, Id);
proc_stmt.execute();
// ... your succeeding code

关于java - 使用PrepareCall方法将参数传递给函数并返回计数值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30603498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com