plsq集合类型定义

时间:2017-09-14 15:27:31

标签: plsql oracle12c plsqldeveloper

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

1 个答案:

答案 0 :(得分:0)

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

作为WEB用户:

grant select on salesline to devuser;

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

通常我们会尝试避免硬编码模式名称,而是使用同义词来管理这些引用,因此DEVUSER

create or replace synonym salesline for web.salesline;

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