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'として接続しているので、ハードコードされたスキーマ名を省略すると、違いはありますか(とにかく一般的には良い方法です)。 –
これは開発にのみ使用されるため、通常は異なるスキーマから実行されます。私はそのテーブルの同義語を 'web'なしで実行するように作成しようとしましたが、同じエラーで失敗します。 – user1595858
上記の例では失敗していますが、 'web'スキーマで作成されたプロシージャですか?そうでない場合、 'web'はプロシージャ所有者に' select'権限を与える必要があります。 (これは、コレクションタイプの定義だけでなく、別のスキーマのオブジェクトへの参照にも適用されます。 –