代码之家  ›  专栏  ›  技术社区  ›  user1595858

plsq集合类型定义

  •  0
  • user1595858  · 技术社区  · 9 年前

    我试图根据本文提供的说明进行插入 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 回复  |  直到 9 年前
        1
  •  0
  •   William Robertson    9 年前

    除非程序是在 web 模式,您正在引用另一个模式的表,因此该模式需要授予您使用它的直接权限。请注意,存储过程中没有角色。

    作为 WEB

    grant select on salesline to devuser;
    

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

    create or replace synonym salesline for web.salesline;
    

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