1

这是我的存储过程:

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

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

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

4

2 回答 2

1

看起来你的问题与 Java 无关,只是在 SQL 方面。难道表中的这两行都有 Role_ID=3 吗?

于 2013-08-08T10:57:02.950 回答
1

您的问题的根本原因:

ORA-01422: exact fetch returns more than requested number of rows

是 PL/SQLselect into语句期望查询与一行完全匹配。如果查询没有返回任何行或查询返回多于一行(如您的情况),它将引发异常。

如果查询可以返回多行,则不能使用select into将结果保存到单个变量。out相反,您的子程序应该返回您的 Java 组件可以查询的游标(即指向记录集的指针)。请注意,返回游标不是唯一的选择,但在您的情况下,它看起来是一个很好的起点。

此问题已在 StackExchange Universe 中多次解决。请看一下

使用 Ref 游标返回记录集的 Java 示例。

于 2013-08-11T07:05:10.477 回答