这是我的存储过程:
CREATE OR REPLACE PROCEDURE VIEWBROKERS
(o_username OUT USERS.USERNAME%TYPE)
AS
BEGIN
SELECT USERNAME
INTO o_username
FROM USERS
WHERE Role_ID = 3 ;
END VIEWBROKERS;
这是调用存储过程的方法:
public ResultSet pullBrokers() {
ResultSet rs = null;
try {
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(Messages.getString("OracleUserManagement.0"), Messages.getString("OracleUserManagement.1"), Messages.getString("OracleUserManagement.2")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
String storedProcedure = "{call VIEWBROKERS(?)}";
CallableStatement statement = con.prepareCall(storedProcedure);
statement.registerOutParameter(1, java.sql.Types.VARCHAR);
rs = statement.executeQuery();
con.commit();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
return rs;
}
最后,当我试图打印出结果时:
public class TEST {
public static void main(String[] args) throws SQLException{
OraclePullListOfUsers pull = new OraclePullListOfUsers();
ResultSet rs = pull.pullBrokers();
try {
while (rs.next()){
System.out.println(rs.getString(1));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
我收到错误消息ORA-01422:精确提取返回的行数多于请求的行数
这很奇怪,因为表格中只有两行数据......
如果有人能指出正确的方向,那就太棒了!
答案 0 :(得分:1)
看起来你的问题与Java无关,只是在SQL方面。可能是表中的这两行都有Role_ID = 3?
答案 1 :(得分:1)
问题的根本原因:
ORA-01422: exact fetch returns more than requested number of rows
是PL / SQL select into
statement期望查询恰好匹配一行。如果查询没有返回任何行,或者查询返回多行(如您的情况),则会抛出异常。
如果查询可以返回多行,则无法使用select into
将结果保存到单个out
变量。相反,您的子程序应该返回Java组件可以查询的游标(即指向记录集的指针)。请注意,返回光标不是唯一的选择,但在您的情况下,它看起来是一个很好的起点。
此问题已在StackExchange Universe中多次解决。请看一下。