Не удается выполнить хранимую процедуру в Oracle

#oracle #stored-procedures #plsql #toad

#Oracle #хранимые процедуры #plsql #жаба

Вопрос:

Вот простой пример использования Toad для аналитики данных 3.0.1.1734. У меня есть полные права доступа к схеме JSWEENEY.

Создайте таблицу

 CREATE TABLE JSWEENEY.TEMP_SQL
(
    SQL VARCHAR2(3000)
);
 

Создайте процедуру

 CREATE OR REPLACE PROCEDURE JSWEENEY.SP_INSERT_SQL
IS
BEGIN   
   INSERT INTO JSWEENEY.TEMP_SQL(SQL) VALUES('SELECT * FROM TEMP_SQL');
   COMMIT;
END JSWEENEY.SP_INSERT_SQL;    
/
 

Выполните процедуру:

 BEGIN
    JSWEENEY.SP_INSERT_SQL;
END;
 

Первая ошибка:

ORA-06550: строка 2, столбец 11:
PLS-00905: объект JSWEENEY.SP_INSERT_SQL недопустим

ORA-06550: строка 2, столбец 2: PL / SQL: оператор игнорируется

Выполните процедуру:

 BEGIN
    EXECUTE JSWEENEY.SP_INSERT_SQL;
END;
 

Вторая ошибка:

ORA-06550: строка 2, столбец 10:
PLS-00103: Обнаружен символ «JSWEENEY» при ожидании одного из следующих действий: := . ( @ % ; немедленно символ «:=» был заменен на «JSWEENEY» для продолжения.

Любые предложения будут с благодарностью приняты.

Комментарии:

1. Ошибка, которую вы получаете при запуске процедуры, указывает на то, что create procedure инструкция завершилась ошибкой синтаксиса. Если вы вернетесь назад и заново создадите процедуру, вы должны получить список ошибок.

2. Спасибо, но Toad указывает, что процедура скомпилирована правильно. Рядом с именем процедуры отображается «X», если она не компилируется правильно.

Ответ №1:

При компиляции процедуры вы получите сообщение об ошибке; если ваш клиент не отображает это, вы можете запросить user_errors представление (или all_errors если вы создаете его в другой схеме), чтобы увидеть проблему. Здесь он будет жаловаться, что:

 LINE/COL ERROR
-------- -----------------------------------------------------------------
6/13     PLS-00103: Encountered the symbol "." when expecting one of the following:
         ;
 

Допустимо использовать имя схемы в create вызове; но не как часть end . Итак, если вам вообще нужно указать схему — чего вы не делаете, если вы создаете объект в своей собственной схеме, но ваша ссылка на разрешения звучит так, как будто вы этого не делаете, — тогда это должно быть:

 CREATE OR REPLACE PROCEDURE JSWEENEY.SP_INSERT_SQL
IS
BEGIN   
   INSERT INTO JSWEENEY.TEMP_SQL(SQL) VALUES('SELECT * FROM TEMP_SQL');
   COMMIT;
END SP_INSERT_SQL;    
/
 

Ваша вторая ошибка заключается в том, что execute на its находится команда клиента (в SQL * Plus и отношениях), а не оператор PL / SQL. Ошибка связана с immediate тем, что в PL / SQL есть execute immediate оператор, который используется для динамического SQL, а не для статических вызовов процедур. Ваш первый синтаксис для запуска процедуры правильный, если сама процедура действительна:

 BEGIN
    JSWEENEY.SP_INSERT_SQL;
END;
/
 

Комментарии:

1. Хорошо, это сработало. Вторая проблема заключается в добавлении параметра. <code> СОЗДАТЬ ИЛИ ЗАМЕНИТЬ ПРОЦЕДУРУ JSWEENEY.SP_INSERT_SQL (pSQL TEMP_SQL.SQL%TYPE) — ЭТО НАЧАТЬ ВСТАВКУ В ЗНАЧЕНИЯ JSWEENEY.TEMP_SQL(SQL) (pSQL’); ФИКСАЦИЯ; ЗАВЕРШЕНИЕ SP_INSERT_SQL; / </code> Это компилируется правильно, затем я запускаю его с <code> НАЧАТЬ JSWEENEY.SP_INSERT_SQL(‘Testing Insert’); END; </code> и получить объект ошибки JSWEENEY.SP_INS

2. Это не будет правильно компилироваться. У вас есть случайная цитата VALUES(pSQL') . Toad должен сообщить вам, что при выполнении вашей проблемы возникает проблема create , и должен показать ее как недопустимую. Понятия не имею, почему это не так — возможно, это запутано, если вы работаете по схемам <пожимаете плечами>. Если вы все еще не можете заставить ее работать, вам следует задать новый вопрос; исходная проблема решена, и код на самом деле не работает в комментариях. Но это похоже на опечатку.

3. Похоже, он также недоволен вызовом столбца SQL в pSQL TEMP_SQL.SQL%TYPE части (или pSQL JSWEENEY.TEMP_SQL.SQL%TYPE , если вы придерживаетесь последовательности * 8-). SQL это ключевое слово, поэтому не очень хороший выбор в качестве имени.

Ответ №2:

попробуйте это отредактировать инструкцию SQL.

 create table TEMP_SQL ( col1 varchar2(100));

CREATE OR REPLACE PROCEDURE SP_INSERT_SQL
AS
BEGIN   
   INSERT INTO TEMP_SQL SELECT * FROM TEMP_SQL;
   COMMIT;
END  SP_INSERT_SQL;
 

Комментарии:

1. Спасибо, но пример должен иллюстрировать вставку литеральной строки в таблицу.