次の表を作成する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';
B2BOWNER
の下にTABLEを作成するときは、PL/SQL関数の前に必ずスキーマ名を付けてください。すなわちB2BOWNER.F_SSC_Page_Map_Insert
。
DBAが指摘するまで、私はこれに気付きませんでした。ルートのUSER/SCHEMAの下にテーブルを作成できれば、PL/SQL関数は正常に機能します。
データベースにプロシージャを作成するとき、プロシージャ名は大文字にする必要があります。次のようにJavaクラスから呼び出すときに、プロシージャ名に小文字を使用できます。
String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";
データベースでは、プロシージャの名前は次のようになります。
GETDBUSERBYUSERID -- (all letters in caps only)
これは、この問題の解決策の1つとして機能します。
あなたはあなたのデータベースに許可を与える必要があります
grant execute on (packageName or tableName) to user;