我试图根据这个站点中提供的指令进行插入。
我可以运行这个例子
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发布于 2017-09-14 16:30:53
除非在web模式中创建了该过程,否则您将引用另一个模式的表,因此模式需要给您使用它的直接权限。请注意,存储过程中没有角色。
作为WEB用户:
grant select on salesline to devuser;(或过程所在的任何架构)。
通常,我们试图避免硬编码模式名称,而是使用同义词来管理这些引用,例如DEVUSER
create or replace synonym salesline for web.salesline;如果您定义了过程authid current_user (默认是authid definer),角色就会重新发挥作用,但是对于执行DML的过程来说,这通常不是一个好主意。
https://stackoverflow.com/questions/46223051
复制相似问题