web-dev-qa-db-fra.com

PLS-00201 - l'identifiant doit être déclaré

J'ai exécuté un script PL/SQL qui a créé le tableau suivant

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

J'ai créé une fonction d'insertion pour cette table en utilisant des arguments

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)

J'ai été informé que je devais déclarer B2BOWNER.SSC_Page_Map avant qu'il n'apparaisse comme un argument pour ma fonction. Pourquoi est-ce que je reçois cette erreur?

EDIT : erreur réelle

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 

EDIT: Fonction PL/SQL complète

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

EDIT: Je change les arguments et je reçois une nouvelle erreur liée à la commande insert

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);

L'erreur

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                                    

Les tables ont été vérifiées dans le schéma correct et avec les noms et types d'attribut corrects

EDIT: J'ai exécuté la commande suivante pour vérifier si j'ai accès

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 sortie que j'ai reçue est

1
PL/SQL procedure successfully completed.

J'ai accès à la table.

EDIT:

J'ai donc finalement effectué une insertion dans la table via le schéma en utilisant PL/SQL et cela a bien fonctionné. Il semble que je n’ai tout simplement pas le pouvoir de créer des fonctions, mais c’est une hypothèse.

EDIT:

Instruction DDL de table réelle

 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

Lors de la création de la table sous B2BOWNER, assurez-vous de préfixer la fonction PL/SQL avec le nom du schéma; c'est à dire. B2BOWNER.F_SSC_Page_Map_Insert.

Je ne m'en suis pas rendu compte jusqu'à ce que les administrateurs de bases de données l'aient signalé. J'aurais pu créer la table sous ma racine USER/SCHEMA et la fonction PL/SQL aurait très bien fonctionné.

6
Mushy

Le nom de la procédure doit être en majuscule lors de la création de la procédure dans la base de données. Vous pouvez utiliser des lettres minuscules pour le nom de votre procédure lorsque vous appelez depuis la classe Java comme:

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

Dans la base de données, le nom de la procédure doit être:

GETDBUSERBYUSERID    -- (all letters in caps only)

Cela constitue l'une des solutions à ce problème.

5
udhay

vous devriez donner la permission sur votre db

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