【问题标题】:plsq collection type definitionplsq 集合类型定义
【发布时间】:2017-09-14 15:27:31
【问题描述】:

我试图根据site 中提供的说明进行插入。

我可以运行这个例子

    CREATE OR REPLACE PROCEDURE test_proc (p_array_size IN PLS_INTEGER DEFAULT 100)
IS
TYPE ARRAY IS TABLE OF all_objects%ROWTYPE;
l_data ARRAY;

CURSOR c IS SELECT * FROM all_objects;

BEGIN
    OPEN c;
    LOOP
    FETCH c BULK COLLECT INTO l_data LIMIT p_array_size;

    FORALL i IN 1..l_data.COUNT
    INSERT INTO t1 VALUES l_data(i);

    EXIT WHEN c%NOTFOUND;
    END LOOP;
    CLOSE c;
END test_proc;
/

同样,我已经更改了表名以供实际使用,如下所示。

    CREATE OR REPLACE PROCEDURE test_proc (p_array_size IN PLS_INTEGER DEFAULT 100)
IS
TYPE ARRAY IS TABLE OF web.salesline%ROWTYPE;
l_data ARRAY;

CURSOR c IS SELECT * FROM web.salesline;

BEGIN
    OPEN c;
    LOOP
    FETCH c BULK COLLECT INTO l_data LIMIT p_array_size;

    FORALL i IN 1..l_data.COUNT
    INSERT INTO t2 VALUES l_data(i);

    EXIT WHEN c%NOTFOUND;
    END LOOP;
    CLOSE c;
END test_proc;
/

但我收到以下错误,即使表存在并且从我正在运行的架构访问。

SQL> show errors
Errors for PROCEDURE :

LINE/COL ERROR
-------- -----------------------------------------------------------------
6/4      PL/SQL: Item ignored
6/34     PLS-00201: identifier 'WEB.SALESLINE' must be declared
11/7     PL/SQL: SQL Statement ignored
16/9     PL/SQL: ORA-00942: table or view does not exist
20/5     PL/SQL: SQL Statement ignored
20/40    PLS-00597: expression 'OBJECTTABLE$' in the INTO list is of wrong
         type

23/5     PL/SQL: SQL Statement ignored
23/27    PL/SQL: ORA-00904: : invalid identifier

【问题讨论】:

  • 你能用web.salesline创建任何程序吗?无论如何,当您以web 连接时,如果您省略硬编码的模式名称(无论如何这通常是一种好习惯),是否会有任何不同。
  • 这仅用于开发,因此通常从不同的模式运行。我尝试为该表创建一个同义词以在没有“网络”的情况下运行,但仍然失败并出现同样的错误。
  • 在上面失败的例子中,过程是在web 模式中创建的吗?如果没有,web 将需要将select 权限授予过程所有者。 (这适用于对另一个模式中的对象的任何引用,而不仅仅是集合类型定义,这就是为什么我问你是否可以编译任何引用 web.salesline 的过程。)
  • 过程 (devuser)owner 拥有dba 角色,因此他也拥有select 权限。
  • 不,他没有 :) 存储的 PL/SQL 不使用角色。

标签: plsql oracle12c plsqldeveloper


【解决方案1】:

除非在web 模式中创建过程,否则您指的是另一个模式的表,因此该模式需要直接授予您使用它的权限。请注意,存储过程中没有角色。

作为WEB用户:

grant select on salesline to devuser;

(或过程所在的任何架构)。

通常我们会尽量避免硬编码模式名称,而是使用同义词管理这些引用,例如DEVUSER

create or replace synonym salesline for web.salesline;

如果您定义过程authid current_user(默认为authid definer),角色会重新发挥作用,但是这对于执行 DML 的过程通常不是一个好主意。

【讨论】:

    猜你喜欢
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 1970-01-01
    • 2016-04-05
    • 2019-09-09
    • 1970-01-01
    相关资源
    最近更新 更多