Если вы хотите ALTER
всех таблиц в текущей схеме, создайте эту процедуру как
SQL> CREATE OR REPLACE PROCEDURE UPDATE_PR_READ_ONLY IS
v_sql VARCHAR2(150);
BEGIN
FOR c IN
(
SELECT *
FROM user_objects o
WHERE o.object_type
)
LOOP
v_sql := 'ALTER TABLE '||c.object_name||' READ ONLY';
EXECUTE IMMEDIATE v_sql;
END LOOP;
END;
/
или Если вы хотите ALTER
только три отдельные таблицы , затем создайте эту процедуру как
SQL> CREATE OR REPLACE PROCEDURE UPDATE_PR_READ_ONLY IS
v_sql VARCHAR2(150);
v_tab owa.vc_arr;
BEGIN
v_tab(1):='PROJECTS'; v_tab(2):='REQUEST_ACTIVITIES'; v_tab(3):='PROJ_REC_SERVICES';
FOR i in 1..3
LOOP
v_sql := 'ALTER TABLE '||v_tab(i)||' READ ONLY';
EXECUTE IMMEDIATE v_sql;
END LOOP;
END;
/
, просматривая значения массива, установленные для имени этой таблицы.
Какую бы процедуру не создать, вызовите как
SQL> EXEC UPDATE_PR_READ_ONLY;
Обратите внимание, что
- добавление имени процедуры после последнего
END
из PROCEDURE
является необязательным, и при добавлении оно должно совпадать с именем PROCEDURE
. Таким образом, UPDATE_PROJ_REQU_READ_ONLY
следует преобразовать в UPDATE_PR_READ_ONLY
в этом случае. - выражение
FOR EACH ROW
используется для триггеров базы данных, но не для хранимых процедур - добавить ключевое слово
IS
или AS
после имени процедуры в первой строке, более предпочтительно использовать параметр OR REPLACE
после CREATE
ключевое слово - a
DDL
оператор не может быть выполнен без использования EXECUTE IMMEDIATE
в хранимой процедуре