使用 Oracle 中的过程从物化视图中的另一个模式中的 table 中插入数据

Insert data in a table in another schema from a materialized view using a procedure in Oracle

我一直在尝试使用过程将物化视图中的数据插入到属于不同方案的 table 中,但是当我编译该过程时,出现以下错误:table 或视图不存在。我已经检查过,并且我拥有 table 的选择和插入权限。 create or replace PROCEDURE PROCEDURE_MYPROCEDURE AS BEGIN INSERT INTO SCHEME.TABLE (COLUMN1,COLUM2) SELECT COLUMN1,COLUMN2 FROM MATERIALIZED_VIEW; END PROCEDURE_MYPROCEDURE;

这一行 SCHEME.TABLE 显示消息 "PL/SQL: STATEMENT IGNORED"、"TABLE OR VIEW DOES NOT EXIST"

最可能的原因是您不是直接通过角色进行访问,这意味着您可以 运行 在 SQL 中进行访问,但对于 PLSQL 过程,您需要直接授予权限。

根据应用程序开发人员指南:

创建过程和函数所需的权限 创建 stand-alone 过程或函数,或包规范或 body,您必须满足以下先决条件: 您必须具有 CREATE PROCEDURE 系统权限才能创建 模式中的过程或包,或 CREATE ANY PROCEDURE 系统特权以在其中创建过程或程序包 另一个用户的架构。 注意:要创建无错,即编译程序 或打包成功,需要以下额外权限: 过程或包的所有者必须已明确 为其中引用的所有 object 授予必要的 object 权限 代码的body;所有者无法获得所需的 通过角色的特权。 如果过程或包的所有者的权限发生变化,过程 在执行之前必须重新验证。如果一个必要的特权 引用的 object 从程序(或包)的所有者处撤销,则 程序无法执行。

一个简单的测试方法是:

SQL> set role none;
SQL> "statement you want to test to see if it'll work in a procedure"

所以您可能只是错过了对那些 object 的一些直接资助。

如果程序是在用户 a 上编译的并且 MATERIALIZED_VIEW 归用户 b 所有。当您执行该过程时,它将查找用户 a 的物化视图。

将 user/schema 放在 MATERIALIZED_VIEW 前面。 您还需要将 MATERIALIZED_VIEW 上的 select 授予用户 a.