2017-09-14 51 views
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 
+0

你可以使用'web.salesline'创建任何程序吗?无论如何,当你连接为'web'时,如果你省略了硬编码的模式名称(无论如何它通常都是好的做法),它会有什么区别吗? –

+0

这将仅用于开发,因此通常从不同的架构运行。我试图为该表创建一个同义词,以便在没有“网络”的情况下运行,但仍然以相同的错误失败。 – user1595858

+0

在上面那个失败的例子中,是在'web'模式中创建的过程吗?如果不是,'web'将需要授予程序所有者'选择'特权。 (这适用于任何对另一个模式中的对象的引用,而不仅仅是集合类型定义,这就是为什么我问你是否可以编译引用'web.salesline'的任何过程。) –

回答

0

除非过程在web模式创建的,你指的是另一种模式的表,所以该模式需要给你使用它的直接权限。请注意,存储过程中不存在任何角色。

作为WEB用户:

grant select on salesline to devuser; 

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

通常我们尝试使用同义词避免硬编码架构名称,而是管理这些引用,从而DEVUSER

create or replace synonym salesline for web.salesline; 

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