plsq 集合类型定义

plsq collection type definition

我试图根据此 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;
/

同样,我已经将 table 名称更改为如下所示。

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

但是我收到以下错误,即使 table 存在并且从我 运行ning 的模式访问。

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 架构中创建的,否则您指的是另一个架构的 table,因此该架构需要直接授予您使用它的权限。请注意,存储过程中没有角色。

作为 WEB 用户:

grant select on salesline to devuser;

(或过程所在的任何模式)。

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

create or replace synonym salesline for web.salesline;

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