2010-05-26 3 views
0

У меня возникли некоторые разочарования, пытаясь упростить процедуру поиска курсора Oracle с JDBC.Получение Oracle Cursor с JDBC

Я продолжаю получать ошибку «[Oracle] [ODBC] [Ora] ORA-06553: PLS-306: неправильное количество или типы аргументов при вызове« GETNAME », но я не могу понять, что я я делаю неправильно.

Вот мой код в Java:

CallableStatement stmt = connection.prepareCall("call getName(?)"); 
stmt.registerOutParameter(1, OracleTypes.CURSOR); 
stmt.execute(); 

stmt.close(); 
con.close(); 

Вот моя процедура в Oracle:

CREATE OR REPLACE PROCEDURE getName(cur out SYS_REFCURSOR) 
IS 
BEGIN 
    OPEN cur FOR 
     SELECT name FROM customer; 
END; 

Ошибка возникает на stmt.execute().

Заранее спасибо.

Кстати, я работаю с Oracle 10.2.0.

+0

Какой jar-файл JDBC вы компилируете и выполняете? –

ответ

2

Я пробовал практически то же самое, и это сработало для меня. Единственное различие заключалось в том, что библиотека Oracle JDBC, которую я использую, не имеет метода registerOutputParameter; Вместо этого я использовал registerOutParameter. Возможно, вы вызываете общий метод JDBC вместо специфичного для Oracle, который поддерживает типы Oracle.

Единственное другое объяснение, о котором я могу думать, это то, что ваш Java-код подключается к неправильной схеме и обращается к другому объекту getName.

+0

Извините, я ошибся имя метода. Есть ли какая-либо проблема с Oracle или не связанная с кодом проблема, которая может вызвать эту ошибку? – BeginnerAmongBeginners

+0

Оказалось, что курсор отлично работает с тонким клиентом JDBC Oracle, но не с ODBC. Не уверен в причине, так как я включил наборы результатов для ODBC. – BeginnerAmongBeginners

0

Нет, это неправильно. Вы не должны возвращать необработанный курсор. Вы должны вызвать хранимую процедуру и выполнить итерацию через ResultSet.

+0

Зависит от базы данных ... SQL Server и Sybase, например, могут возвращать наборы результатов из хранимой процедуры, но в Oracle вам нужно вернуть Cursor. – AWhitford

+0

Нет, о чем я говорил * два года назад * возвращал необработанный курсор или ResultSet из вашего уровня сохранения. Вы должны перебрать его, загрузить содержимое в структуру данных, объект или какую-либо коллекцию и закрыть курсор или ResultSet. У вас не будет утечек памяти или превышено максимальное число курсоров. Я думаю, вы неправильно поняли. Возможно, вам захочется пересмотреть ваш голос. – duffymo