2013-08-08 3 views
1

Вот моя хранимая процедура:Почему этот вызов хранимой процедуры от Java не работает?

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(); 
      } 
    } 
} 

I получить сообщение об ошибке ORA-01422: точная выборка возвращает больше запрошенного количества строк

Что странно, потому что в таблице всего два ряда данных ...

Если кто-то может указать мне вправо направление, это было бы потрясающе!

+1

Сколько строк возвращает ваш запрос выбора? Если он возвращает более 1, вот где ваша проблема. – Noel

ответ

1

Похоже, что проблема связана не с Java, а только со стороны SQL. Может ли быть, что обе эти строки в таблице имеют Role_ID = 3?

+0

Да Есть две строки, которые имеют Role_ID = 3. Дело в том, что я хочу, чтобы он возвращал несколько строк! – DeaIss

+0

Кроме того, даже если есть одна строка, я все равно получаю сообщение об ошибке: «Закрытое соединение: следующее» – DeaIss

+0

@oOTesterOo При использовании параметров 'OUT' AFAIK вы можете получить только однотонный результат. Таким образом, проблема имеет более одного результата. –

1

Основная причина для вашей проблемы:

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

является то, что PL/SQL select into statement ожидает запрос, чтобы соответствовать в точности одной строки. Если запрос не возвращает строк, или если запрос возвращает более одной строки (как в вашем случае), он выдает исключение.

Вы не можете использовать select into, чтобы сохранить результаты только в одной переменной out, если запрос может возвращать более одной строки. Вместо этого ваша подпрограмма должна вернуть курсор (то есть указатель на набор записей), который может запросить ваш Java-компонент. Обратите внимание, что возврат курсора не является единственным вариантом, но в вашем случае это выглядит хорошей отправной точкой.

Эта проблема была рассмотрена несколько раз во вселенной StackExchange. Пожалуйста, посмотрите, например.

пример Java, Using Ref Cursors To Return Recordsets.

Смежные вопросы