2017-09-14 15 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

これは開発にのみ使用されるため、通常は異なるスキーマから実行されます。私はそのテーブルの同義語を 'web'なしで実行するように作成しようとしましたが、同じエラーで失敗します。 – user1595858

+0

上記の例では失敗していますが、 'web'スキーマで作成されたプロシージャですか?そうでない場合、 'web'はプロシージャ所有者に' select'権限を与える必要があります。 (これは、コレクションタイプの定義だけでなく、別のスキーマのオブジェクトへの参照にも適用されます。 –

答えて

0

手順はwebスキーマに作成されていない限り、あなたは別のスキーマのテーブルを参照している、ので、そのスキーマはあなたにそれを使用する直接権限を与える必要があります。ストアドプロシージャにはロールが存在しないことに注意してください。

grant select on salesline to devuser; 

(または任意のスキーマ手順が常駐):WEBユーザとして

通常DEVUSERように、我々は、スキーマ名をハードコーディング避け、代わりに同義語を使用してこれらの参照を管理しよう:あなたが手順authid current_userを定義した場合の役割は、しかし、(デフォルトはauthid definerで)戻っ遊びに来

create or replace synonym salesline for web.salesline; 

これは一般的に、DMLを実行するプロシージャには適していません。

関連する問題