2017-01-06 87 views
3

Oracleデータベースにuser1として接続します。データベース内にはuser2が存在し、pack1のパッケージには、2つのストアドプロシージャproc1proc2が含まれています。PLS-00201:識別子 'TYPE'を宣言する必要があります

私はこれらの手順を呼び出そうとしていますが、上記のエラーが発生しています。エラーには、Typesで定義されている 'type1'が記述されています。

いくつかの調査の後で、特権をチェックするように勧められましたが、それはうまくいくようです。私はOracle SQL Developerを使用しています。pack1type1の "grant"をクリックすると、私のユーザーはEXECUTE権限とDEBUG権限を持っています。

私はそれがコード内のエラーだと思ったが、それは別のエラーを投げるだろう。パッケージの同義語を作成することを考えましたが、そのようなことができることを読んだが、私はそうする権利がありません。私が尋ねる前に、私はすべての選択肢を使い果たしたいと思っていました。

私はそれらのストアドプロシージャを実行しようとすると、SQL Developerによって作成されたデフォルトのコールと準備されたコールの両方を使用しようとしました。面白いことに、コードを実行すると、前述のエラーがスローされます。私が "デフォルトの"コードを実行すると、 "絶対パスでの相対パス"エラーが出ます。

逃したことはありますか?

これは、プロシージャを呼び出すために使用しているコードです。

DECLARE 
ClientData type1; 
BEGIN 
pack1.proc1(param1,param2,ClientData); 
FOR i IN 1..ClientData.LAST LOOP 
DBMS_OUTPUT.PUT_LINE(ClientData(i).kid ||' '...; 
--DBMS_OUTPUT.PUT_LINE(ClientData(i).portfolioName); 
--DBMS_OUTPUT.PUT_LINE(ClientData(i).clientCategory); 
--DBMS_OUTPUT.PUT_LINE(ClientData(i).typ_pf); 
--DBMS_OUTPUT.PUT_LINE(ClientData(i). ptf_ccy); 
END LOOP; 
END; 

EDIT 1:ここでは完全なエラーです:通常の状況下では

ORA-06550: row 2, column 14: 
PLS-00201: identifier 'SYSADMIN(user2).CLIENTDATAINSTRESB_A(type1)' must be declared 
ORA-06550: row 2, column 14: 
PL/SQL: Item ignored 
ORA-06550: row 4, column 53: 
PLS-00320: the declaration of the type of this expression is  incomplete or malformed 
ORA-06550: row 4, column 1: 
PL/SQL: Statement ignored 
ORA-06550: row 5, column 13: 
PLS-00320: the declaration of the type of this expression is incomplete or malformed 
ORA-06550: row 5, column 1: 
PL/SQL: Statement ignored 
06550. 00000 - "line %s, column %s:\n%s" 
*Cause: Usually a PL/SQL compilation error. 
*Action: 

が、私は手続きの本体が含まれるであろう、しかし、それはビジネスのため、私は共有しないことができるものです。
私が理解しているところでは、呼び出しの最初に宣言が失敗し、エラーの残りが発生します。これは、 'type1'が呼び出された場所に対応するためです。
'type1'が何であるかをさらに説明するために、それは表( 'type2')に対するコメントです。これは、次のコードによって作成されます。

PLS-00201: identifier 'user2.type1' must be declared 
:それは同じエラーを再現し、しかし

DECLARE 
ClientData user2.type1; 

create or replace TYPE type1 IS TABLE OF type2; 

EDIT @Alex Poole氏が示唆した2 として、私は私の宣言を変更しました

EDIT 3
誤った名前は私がコードを消毒するのを忘れたために修正されました。
パッケージとその両方のタイプは、user2によって所有されています。私がデータベースに接続すると、私の見解から何も見えません。テーブル、パッケージ、タイプはありません。 また、私は必要なすべてのオブジェクトに対して特権(EXECUTE & DEBUG)を持っていることを肯定しています。これはパッケージであり、定義されています
特権がどのように与えられたかについて話をするとき、それを確認する方法はありますか?私は、権限受領
EDIT 4
これはUSER_TAB_PRIVS SELECT * FROMの結果であるように、コマンド

付与者としてuser2の一覧を示します
SELECT * FROM USER_TAB_PRIVS; 

と所有者とUSER1を使用しました。

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRANTABLE HIERARCHY COMMON TYPE 
USER1 USER2 TYPE2  USER2 DEBUG  NO   NO   NO TYPE 
USER1 USER2 TYPE2  USER2 EXECUTE  NO   NO   NO TYPE 
USER1 USER2 TYPE1  USER2 DEBUG  NO   NO   NO TYPE 
USER1 USER2 TYPE1  USER2 EXECUTE  NO   NO   NO TYPE 
USER1 USER2 PACK1  USER2 DEBUG  NO   NO   NO PACKAGE 
USER1 USER2 PACK1  USER2 EXECUTE  NO   NO   NO PACKAGE 
PUBLIC SYS  USER1  USER1 INHERIT PRIVILEGES NO NO NO USER 

EDIT 5:結果表を小文字から大文字に変更しました。しかし、提案したように、私はパッケージとタイプの名前を二重チェックしましたが、実際は大文字です。

+0

Wh 'Types'は' type1'を含むものを定義する別のパッケージですか?あるいは、 'type1'はSQLレベルの型ですか?どのユーザーがパッケージ/タイプを所有していますか、この匿名ブロックをどのユーザーが実行していますか? –

+1

ユーザーは直接またはロール(DBAロールなど)を介して権限を持っていますか? –

+0

@AlexPoole申し訳ありませんがそれをクリアします。 'type1'は 'type2'のテーブルです。それをもっと明確にするために、コードは次のようになります: 'TYPE type1の作成または置き換えtype2; ' –

答えて

0

あなたの主な問題はあなたのタイプの定義だと思います。

どのタイプがどのラインで使用されているかチェックする必要があります。あなたが持っている必要がありますどのような

USER1を - > NO TYPES、

user2はuser2の-ものを呼び出すパッケージ - > Type1の、パック1、するProc1

例:

-- Create your type on schema user2 
CREATE OR REPLACE TYPE USER2.TestType AS OBJECT 
(
    NEWATTRIB1 VARCHAR2(1000) 
) 
/

-- Create your package at user2 
CREATE OR REPLACE PACKAGE user2.TestPackage AS 
    FUNCTION MyFunction(Param1 IN TestType) RETURN TestType; 
END TestPackage; 
/
CREATE OR REPLACE PACKAGE BODY user2.TestPackage AS 
    FUNCTION MyFunction(Param1 IN TestType) RETURN TestType IS 
    BEGIN 
    RETURN Param1; 
    END; 
END TestPackage; 
/

-- Grant rights user1 (run with user2) 
GRANT ALL ON TestType TO User1 WITH GRANT OPTION; 
GRANT EXECUTE ON TestPackage TO User1 WITH GRANT OPTION; 

-- Call proc from User1 
declare 
    tmp USER2.TestType; 
    tmp2 USER2.TestType; 
begin 
    tmp := USER2.TestType('Mr.Smith'); 

    tmp2 := USER2.TESTPACKAGE.MYFUNCTION(tmp); 

    dbms_output.put_line('tmp: ' || tmp.NEWATTRIB1); 
    dbms_output.put_line('tmp2: ' || tmp2.NEWATTRIB1); 
end; 

覚えておいてください: 2つのタイプは決して同じではありません!スキーマで型を使用する場合、別のスキーマで類似型を定義してオブジェクトを取得することはできません。他のスキーマ(= user2.type1)に明示的に名前を付ける必要があります。 タイプを使用したいスキーマ/ユーザ(あなたの例では、grant type-and package-privs)に権限を付与する必要があります。 USER1

    1. ログオンあなたのタイプ

      declare 
          tmp user2.type1; 
      begin 
          tmp := user2.type1('Mr.Smith'); 
          -- if this works, your type-privs are correct. 
      end; 
      
    2. 書き込みを使用して、いくつかのPLSQLを書く:

      既存のプロジェクトでのトラブルシューティングなどの

      、あなたはそれがステップバイステップでチェックすることができますパッケージを使用するいくつかのplsql

  • 関連する問題