2017-09-14 50 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的過程,這通常不是一個好主意。