在 Oracle 过程中立即执行

Posted

技术标签:

【中文标题】在 Oracle 过程中立即执行【英文标题】:Execute immediate within Oracle Procedure 【发布时间】:2017-12-04 11:58:48 【问题描述】:

我有两个用户:SASDBA 和 CDM。 模式SASDBA 中有一个将对象保存到缓冲池中的过程。 程序的一部分:

BEGIN
              FOR TABLE_ENTRY IN
              (SELECT          *
              FROM dba_tables
              WHERE owner = t_owner
              AND TABLE_NAME    = t_name_obj
              )
              LOOP
EXECUTE immediate 'alter table '||TABLE_ENTRY.OWNER||'.'||TABLE_ENTRY.TABLE_NAME||' storage (buffer_pool keep)';
    END LOOP;
END;

所以,如果我尝试将 CDM.TABLE_TEST 传递到程序中,我会收到错误:

ORA-01031: 权限不足

但是,如果用户 SASDBA 未经程序更改它,它会起作用:

alter table CDM.TEST_TABLE  storage (buffer_pool keep)

表 CDM.TEST_TABLE 已更改。

【问题讨论】:

你是从SASDBA用户那里调用这个过程吗? 【参考方案1】:

在 PL/SQL 块中,您只有直接授予您的权限。通过角色授予的特权(例如DBA)不适用于 PL/SQL 块(即过程)内。

直接授予权限,例如GRANT ALTER ANY TABLE TO SASDBA;

【讨论】:

以上是关于在 Oracle 过程中立即执行的主要内容,如果未能解决你的问题,请参考以下文章

使用 PL/SQL 过程在 oracle 10g 中转储表

Oracle SQL:在立即执行的内部循环中使用外部循环标识符

使用 to_date ORACLE 立即执行格式化

执行立即变量中的单引号 - Oracle PLSQL

立即执行 hsqldb

使用立即执行调整数据文件 oracle 的大小