Хранимая процедура Oracle с командой Alter - PullRequest
5 голосов
/ 23 марта 2010

Я пытаюсь создать хранимую процедуру Oracle, которая будет принимать имя таблицы в качестве параметра. Затем процедура перестроит все индексы в таблице.

Моя проблема в том, что я получаю ошибку при использовании команды ALTER из хранимой процедуры, как будто PLSQL не разрешает эту команду.

Ответы [ 3 ]

10 голосов
/ 23 марта 2010

Используйте оператор execute immediate для выполнения DDL внутри PL / SQL.

create procedure RebuildIndex(index_name varchar2) as
begin
   execute immediate 'alter index ' || index_name || ' rebuild';
end;

Я проверил этот код; это работает.

4 голосов
/ 23 марта 2010

Документация.

Передача имен объектов схемы в качестве параметров

Предположим, вам нужна процедура, которая принимает имя любой базы данных стол, а затем удаляет этот стол из вашего схемы. Вы должны построить строку с заявление, которое включает в себя объект имена, затем используйте EXECUTE IMMEDIATE для выполнить инструкцию:

CREATE TABLE employees_temp AS SELECT last_name FROM employees;
CREATE PROCEDURE drop_table (table_name IN VARCHAR2) AS
BEGIN
  EXECUTE IMMEDIATE 'DROP TABLE ' || table_name;
END;
/

Используйте конкатенацию для построения строки, вместо того, чтобы пытаться пройти стол имя в качестве переменной связывания через УСЛОВИЯ ИСПОЛЬЗОВАНИЯ.

Кроме того, если вам нужно позвонить процедура, имя которой неизвестно до время выполнения, вы можете передать параметр определение процедуры. За Например, следующая процедура может вызвать другую процедуру (drop_table) указание имени процедуры при казнены.

CREATE PROCEDURE run_proc (proc_name IN VARCHAR2, table_name IN VARCHAR2) ASBEGIN
   EXECUTE IMMEDIATE 'CALL "' || proc_name || '" ( :proc_name )' using table_name;
END;
/

Если вы хотите сбросить стол с Процедура drop_table, вы можете запустить Процедура выглядит следующим образом. Обратите внимание, что имя процедуры пишется с заглавной буквы.

CREATE TABLE employees_temp AS SELECT last_name FROM employees;
BEGIN 
  run_proc('DROP_TABLE', 'employees_temp'); 
END;
/
2 голосов
/ 23 марта 2010

Вот несколько возможностей. Во-первых, вы должны рассматривать SQL как динамический SQL. Во-вторых, операторы Oracle DDL не могут быть запущены в транзакции (или они завершают текущую транзакцию и не могут сами откатываться). Это может повлиять на то, можете ли вы использовать их в хранимых процедурах или где вы можете использовать хранимые процедуры, которые их содержат.

Если ничего из вышеперечисленного не применимо вообще - возможно, что-то еще сбилось с пути - я предлагаю опубликовать некоторый код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...