Oracleデータベースにuser1
として接続します。データベース内にはuser2
が存在し、pack1
のパッケージには、2つのストアドプロシージャproc1
とproc2
が含まれています。PLS-00201:識別子 'TYPE'を宣言する必要があります
私はこれらの手順を呼び出そうとしていますが、上記のエラーが発生しています。エラーには、Typesで定義されている 'type1'が記述されています。
いくつかの調査の後で、特権をチェックするように勧められましたが、それはうまくいくようです。私はOracle SQL Developerを使用しています。pack1
とtype1
の "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の結果であるように、コマンド
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:結果表を小文字から大文字に変更しました。しかし、提案したように、私はパッケージとタイプの名前を二重チェックしましたが、実際は大文字です。
Wh 'Types'は' type1'を含むものを定義する別のパッケージですか?あるいは、 'type1'はSQLレベルの型ですか?どのユーザーがパッケージ/タイプを所有していますか、この匿名ブロックをどのユーザーが実行していますか? –
ユーザーは直接またはロール(DBAロールなど)を介して権限を持っていますか? –
@AlexPoole申し訳ありませんがそれをクリアします。 'type1'は 'type2'のテーブルです。それをもっと明確にするために、コードは次のようになります: 'TYPE type1の作成または置き換えtype2; ' –