#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. Спасибо, но пример должен иллюстрировать вставку литеральной строки в таблицу.