如何使用 PL/SQL 为多个表创建 ALTER READ ONLY?

How to create ALTER READ ONLY using PL/SQL for multiple tables?

我想知道如何通过创建 PROCEDURE 使用 PL/SQLALTERREAD ONLY 的表。到目前为止,我尝试了以下代码块:

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;

更改 TABLE table_name 只读;

如果您想 ALTER 当前架构中的所有 table,请将此过程创建为

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只有三个人table,那么创建这个程序为

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;
/

通过遍历设置为 table 名称的数组值。

无论创建什么程序,都调用为

SQL> EXEC UPDATE_PR_READ_ONLY;

注意

  • PROCEDURE 的最后 END 之后添加过程名称是 可选,如果添加它应该与 PROCEDURE 名称相同。 因此,UPDATE_PROJ_REQU_READ_ONLY 应转换为 UPDATE_PR_READ_ONLY 在这种情况下。
  • 表达式FOR EACH ROW用于数据库触发器,但不用于 存储过程
  • 在第一行程序名称后添加关键字ISAS, 在 CREATE 关键字
  • 之后使用 OR REPLACE 选项更可取
  • 如果不使用 EXECUTE IMMEDIATE,则无法发出 DDL 语句 在存储过程中