oracle - ora - pls-00201 el identificador se debe declarar
PLS-00201-el identificador debe ser declarado (3)
Al crear la TABLA en B2BOWNER
, asegúrese de prefijar la función PL / SQL con el nombre del esquema; es decir, B2BOWNER.F_SSC_Page_Map_Insert
.
No me di cuenta de esto hasta que los DBA lo señalaron. Podría haber creado la tabla bajo mi raíz USER / SCHEMA y la función PL / SQL habría funcionado bien.
Ejecuté un script PL / SQL que creó la siguiente tabla
TABLE_NAME VARCHAR2(30) := ''B2BOWNER.SSC_Page_Map'';
Hice una función de inserción para esta tabla usando argumentos
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)
Se me notificó que tenía que declarar B2BOWNER.SSC_Page_Map
antes de que apareciera como un argumento a mi función. ¿Por qué estoy recibiendo este error?
EDITAR : error real
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
EDITAR: Completa la función 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
EDITAR: cambio los argumentos y recibí un nuevo error relacionado con el comando de inserción
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);
El error
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
Las tablas se han verificado dentro del esquema correcto y con los nombres y tipos de atributos correctos
EDITAR: He ejecutado el siguiente comando para comprobar si tengo acceso
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;
La salida que recibí es
1
PL/SQL procedure successfully completed.
Tengo acceso a la mesa.
EDITAR:
Así que finalmente realicé una inserción en la tabla a través del esquema usando PL / SQL y funcionó bien. Parece que simplemente no tengo autoridad para crear funciones, pero eso es una suposición.
EDITAR:
Tabla DDL declaración real
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'';
El nombre del procedimiento debe estar en mayúsculas mientras se crea el procedimiento en la base de datos. Puede usar letras pequeñas para el nombre de su procedimiento mientras llama desde una clase Java como:
String getDBUSERByUserIdSql = "{call getDBUSERByUserId(?,?,?,?)}";
En la base de datos el nombre del procedimiento debe ser:
GETDBUSERBYUSERID -- (all letters in caps only)
Esto sirve como una de las soluciones para este problema.
usted debe dar permiso en su db
grant execute on (packageName or tableName) to user;