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'的任何過程。) –