【发布时间】: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