为什么这个Java存储过程调用不起作用?

时间:2013-08-08 10:47:20

标签: java sql stored-procedures plsql call

这是我的存储过程:

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:精确提取返回的行数多于请求的行数

这很奇怪,因为表格中只有两行数据......

如果有人能指出正确的方向,那就太棒了!

2 个答案:

答案 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中多次解决。请看一下。

Java示例Using Ref Cursors To Return Recordsets