web-dev-qa-db-ja.com

PLS-00201-識別子を宣言する必要があります

次の表を作成するPL/SQLスクリプトを実行しました

TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';

引数を使用してこのテーブルの挿入関数を作成しました

CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
         p_page_id   IN B2BOWNER.SSC_Page_Map.Page_ID_NBR%TYPE, 
         p_page_type IN B2BOWNER.SSC_Page_Map.Page_Type%TYPE, 
         p_page_dcpn IN B2BOWNER.SSC_Page_Map.Page_Dcpn%TYPE)

関数の引数として表示される前に、B2BOWNER.SSC_Page_Mapを宣言する必要があると通知されました。このエラーが発生するのはなぜですか?

EDIT:実際のエラー

Warning: compiled but with compilation errors
Errors for FUNCTION F_SSC_PAGE_MAP_INSERT

LINE/COL ERROR                                                            
-------- -----------------------------------------------------------------
2/48     PLS-00201: identifier 'SSC_PAGE_MAP.PAGE_ID_NBR' must be declared
0/0      PL/SQL: Compilation unit analysis terminated 

編集:完全なPL/SQL関数

RETURN INTEGER
IS
   TABLE_DOES_NOT_EXIST exception;  
   PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942

BEGIN

   INSERT INTO 
       B2BOWNER.SSC_Page_Map VALUES(
           p_page_id, 
           p_page_type, 
           p_page_dcpn);

   RETURN 0;

   EXCEPTION
       WHEN TABLE_DOES_NOT_EXIST THEN
           RETURN -1;
       WHEN DUP_VAL_ON_INDEX THEN
           RETURN -2;
       WHEN INVALID_NUMBER THEN
           RETURN -3;
       WHEN OTHERS THEN
           RETURN -4;
END;

SHOW ERRORS PROCEDURE F_SSC_Page_Map_Insert;

GRANT EXECUTE ON F_SSC_Page_Map_Insert TO B2B_USER_DBROLE; 
RETURN INTEGER

編集:引数を変更し、挿入コマンドに関連する新しいエラーを受け取りました

CREATE OR REPLACE FUNCTION F_SSC_Page_Map_Insert(
                            p_page_id   IN INTEGER, 
                            p_page_type IN VARCHAR2, 
                            p_page_dcpn IN VARCHAR2)

RETURN INTEGER
IS

TABLE_DOES_NOT_EXIST exception;  
PRAGMA EXCEPTION_INIT(TABLE_DOES_NOT_EXIST, -942); -- ORA-00942

BEGIN

INSERT INTO 
    B2BOWNER.SSC_Page_Map VALUES(
        p_page_id, 
        p_page_type, 
        p_page_dcpn);

エラー

Errors for FUNCTION F_SSC_PAGE_MAP_INSERT

LINE/COL ERROR                                                            
-------- -----------------------------------------------------------------
17/18    PL/SQL: ORA-00942: table or view does not exist                  
16/5     PL/SQL: SQL Statement ignored                                    

テーブルが正しいスキーマ内で、正しい属性名とタイプで検証されている

編集:次のコマンドを実行して、アクセス権があるかどうかを確認します

DECLARE
    count_this INTEGER;

BEGIN

select count(*) into count_this 
from all_tables 
where owner = 'B2BOWNER' 
and table_name = 'SSC_PAGE_MAP';

DBMS_OUTPUT.PUT_LINE(count_this);

END;

私が受け取った出力は

1
PL/SQL procedure successfully completed.

テーブルにアクセスできます。

編集:

そのため、最終的にPL/SQLを使用してスキーマ経由でテーブルへの挿入を実行し、正常に機能しました。私は単に関数を作成する権限を持っていないようですが、それは仮定です。

編集:

実際のテーブルDDLステートメント

 v_create := 'CREATE TABLE ' ||  TABLE_NAME || ' (
                PAGE_ID_NBR   NUMERIC(10)   NOT NULL Check(Page_ID_NBR > 0),
                PAGE_TYPE     VARCHAR2(50)  NOT NULL, 
                PAGE_DCPN     VARCHAR2(100) NOT NULL,
                PRIMARY KEY(Page_ID_NBR, Page_Type))';

EXECUTE IMMEDIATE v_create; 

COMMIT WORK;

COMMIT COMMENT 'Create Table'; 
24
Mushy

B2BOWNERの下にTABLEを作成するときは、PL/SQL関数の前に必ずスキーマ名を付けてください。すなわちB2BOWNER.F_SSC_Page_Map_Insert

DBAが指摘するまで、私はこれに気付きませんでした。ルートのUSER/SCHEMAの下にテーブルを作成できれば、PL/SQL関数は正常に機能します。

6
Mushy

データベースにプロシージャを作成するとき、プロシージャ名は大文字にする必要があります。次のようにJavaクラスから呼び出すときに、プロシージャ名に小文字を使用できます。

String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";

データベースでは、プロシージャの名前は次のようになります。

GETDBUSERBYUSERID    -- (all letters in caps only)

これは、この問題の解決策の1つとして機能します。

5
udhay

あなたはあなたのデータベースに許可を与える必要があります

grant execute on (packageName or tableName) to user;
2
elfekz