0
我试图根据此site中提供的说明进行插入。plsq收集类型定义
我可以运行这个例子
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'时,如果你省略了硬编码的模式名称(无论如何它通常都是好的做法),它会有什么区别吗? –
这将仅用于开发,因此通常从不同的架构运行。我试图为该表创建一个同义词,以便在没有“网络”的情况下运行,但仍然以相同的错误失败。 – user1595858
在上面那个失败的例子中,是在'web'模式中创建的过程吗?如果不是,'web'将需要授予程序所有者'选择'特权。 (这适用于任何对另一个模式中的对象的引用,而不仅仅是集合类型定义,这就是为什么我问你是否可以编译引用'web.salesline'的任何过程。) –