Возникли проблемы с вызовом хранимой процедуры Oracle в Java - PullRequest
1 голос
/ 22 июля 2011

У меня проблемы с вызовом хранимой процедуры Oracle на Java.Я добавил хранимую процедуру в базу данных следующим образом:

         String SQL = "CREATE OR REPLACE PROCEDURE LIVERESULTS() " +
                    "IS " +
                    "BEGIN" +
                            " SELECT POOL_ID, POOL_MBR_ID, BSLN_CD, PGE_TYP_NM, SERV_NM, CL_FILE_NM" +
                            " FROM LBMADM.TPPO_MSTR_MAP " +
                            " ORDER BY SERV_NM" +
                            " WHERE PGE_TYP_NM = 'live' ; " +
                    "END";

                    stmtLIVE = con.createStatement();
                    stmtLIVE.executeUpdate(SQL);

И теперь я пытаюсь вызвать ее так:

CallableStatement cs;

                 try {
                         cs = con.prepareCall("{call LIVERESULTS() }");
                         rs = cs.executeQuery();

                         while (rs.next()) {
 .....

Однако я получаю следующие ошибки:

 java.sql.SQLException: ORA-06550: line 1, column 7:
 PLS-00905: object UT9J.GENERATE_SQL_FOR_LIVE is invalid
 ORA-06550: line 1, column 7:
 PL/SQL: Statement ignored

Я не могу понять, где я иду не так.Я прочитал документацию Oracle по этому поводу и считаю, что все сделал правильно, но, наверное, нет.Если кто-нибудь сможет пролить свет на ситуацию, я буду очень признателен.

Ответы [ 4 ]

8 голосов
/ 22 июля 2011

Здесь есть несколько проблем ..

1) Почему вы хотите создать процедуру внутри Java-кода?Вы должны создать его непосредственно в Oracle с помощью SQLPLUS или любого другого инструмента базы данных.

2) Oracle не ожидает (), когда отсутствуют параметры входа / выхода / выхода, поэтому они вам не нужны.Вам также необходимо использовать ключевые слова as или is после процедуры создания или замены.В противном случае это выдаст ошибку времени компиляции, которую вы видите ..

  1  CREATE OR REPLACE PROCEDURE LIVE
  2  IS
  3  begin
  4    null;   ---This would usually have your logic, 
               --Null indicates "DO nothing". Just to concentrate on 
               --the "declare" issues
  5* end;
SQL> /

Procedure created.

3) Третья ошибка заключается в том, что вы выбираете поля из таблицы, но нет переменных "INTO", которыми вы являетесьвыбирая их.

  1  CREATE OR REPLACE PROCEDURE LIVE
  2  AS
  3    v_ename scott.emp.ename%type;
  4  begin
  5    select ename
  6      from scott.emp
  7      where empno = 7369;
  8* end;
SQL> /

Warning: Procedure created with compilation errors.

SQL> show errors
Errors for PROCEDURE LIVE:

LINE/COL ERROR
-------- -----------------------------------------------------------------
5/3      PLS-00428: an INTO clause is expected in this SELECT statement

  1  CREATE OR REPLACE PROCEDURE LIVE
  2  AS
  3    v_ename scott.emp.ename%type;
  4  begin
  5    select ename
  6      into v_ename
  7      from scott.emp
  8      where empno = 7369;
  9* end;
SQL> /

Procedure created.

4) Вы создаете процедуру с именем «LIVE» и вызываете «LIVERESULTS». Опять же, вам не нужно () после вызова процедуры.

5) На основеПриведенные ниже комментарии Аллана и ответ Cybernate (+1): если вы пытаетесь вернуть набор результатов, вам следует открыть рефкурсор для выбора и затем вернуть его вызывающей программе.

4 голосов
/ 22 июля 2011

Хранимая процедура LIVE не будет скомпилирована без ошибок, поскольку в SP имеется предложение SELECT STATEMENT без INTO, которое недопустимо.

Отсюда проблема.Используйте REF CURSOR для возврата набора результатов.

2 голосов
/ 22 июля 2011

В дополнение к другим ответам, которые все хороши ...

Вы, вероятно, ожидаете, что, поскольку CREATE PROCEDURE не вызывает исключение SQLException, процедура компилируется успешно.Но это просто указывает на то, что оно успешно выполнено в виде оператора SQL - т.е. процедура была создана.Затем процедура должна быть скомпилирована как код PL / SQL, и она не работает из-за различных синтаксических ошибок, указанных другими.В этой ситуации процедура создается, поэтому SQL завершается успешно, но имеет ошибки и является недопустимым.

Инструмент, специфичный для Oracle, такой как SQL * Plus, знает об этом и отображает соответствующую обратную связь («Процедурасоздан с ошибками компиляции "), как показано в ответе Раджеша.JDBC не проверяет это автоматически.Если вам действительно нужно сделать создание из Java, вы должны немедленно проверить наличие ошибок после выполнения CREATE: SELECT * FROM USER_ERRORS WHERE NAME='LIVERESULTS'.Это вернет, по существу, ту же информацию, которая отображается командой SQL * Plus SHOW ERRORS.

Вам необходимо устранить ошибки компиляции PL / SQL, прежде чем вы сможете вызвать процедуру.

0 голосов
/ 22 июля 2011

Вам не хватает [обязательного] IS (или, альтернативно, «AS») .

CREATE OR REPLACE PROCEDURE LIVE() 
IS 
BEGIN
   <the body here> 
END;

[править]

...