Как создать ALTER READ ONLY, используя PL / SQL для нескольких таблиц? - PullRequest
1 голос
/ 13 апреля 2020

Я хотел бы знать, как использовать таблицы от PL/SQL до ALTER до READ ONLY путем создания PROCEDURE. Я пробовал приведенный ниже блок кода:

CREATE PROCEDURE UPDATE_PROJ_REQU_READ_ONLY
FOR EACH ROW
BEGIN
  ALTER TABLE projects READ ONLY;
  ALTER TABLE request_activities READ ONLY;
  ALTER TABLE proj_rec_services READ ONLY;           
END UPDATE_PROJ_REQU_READ_ONLY;

Ответы [ 2 ]

1 голос
/ 14 апреля 2020

Если вы хотите 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 в хранимой процедуре
0 голосов
/ 14 апреля 2020

ALTER TABLE table_name ТОЛЬКО ЧИТАТЬ;

...