PLS-00201 - identificateur doit être déclaré
J'ai exécuté une PL/SQL script qui a créé le tableau suivant
TABLE_NAME VARCHAR2(30) := 'B2BOWNER.SSC_Page_Map';
J'ai fait une fonction insert pour cette table à l'aide d'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 j'avais à déclarer B2BOWNER.SSC_Page_Map
avant d'apparaître comme un argument de ma fonction. Pourquoi j'obtiens cette erreur?
MODIFIER: 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: Complète de la Fonction 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
EDIT: - je changer les arguments et a reçu un nouveau message d'erreur lié à 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
Tables a été vérifiée dans le schéma correct et avec les bons noms d'attributs et de types
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, j'ai reçu est
1
PL/SQL procedure successfully completed.
J'ai accès à la table.
EDIT:
Donc j'ai enfin procédé à une insertion dans la table via le schéma à l'aide de PL/SQL et il a bien fonctionné. Il apparaît que je n'ai tout simplement pas le pouvoir de créer des fonctions, mais c'est une hypothèse.
EDIT:
Table réelle instruction 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';
- Vous n'avez pas compris tout code qui serait la cause de cette erreur. De ce fait, il est assez difficile de déterminer pourquoi vous pourriez avoir causé l'erreur. Pouvez-vous aussi s'il vous plaît poster l'erreur plutôt que de votre interprétation de celle-ci?
- Comme vous pouvez le voir dans la posté erreur c'est en effet un réel problème
- Je n'ai jamais contesté le fait que vous aviez un problème @Molles, c'est juste que tu ne donnes pas assez d'informations pour résoudre le problème. L'erreur que vous avez posté est différente de celle indiquée.. il déclare qu'il n'existe aucun identifiant
SSC_PAGE_MAP.PAGE_ID_NBR
. Avez-vous validé le fait que la colonnePAGE_ID_NBR
sur la tableSSC_PAGE_MAP
dans le schéma " B2BOWNER` existe et que vous avez la possibilité de SÉLECTIONNER à partir de ce tableau dans le schéma que vous êtes la création de cette fonction? - Oui, le tableau vérifiée comme existant en vertu de schéma, peut être la cible d'une instruction DDL et les attributs d'une telle table sont vérifiées et match argument de la fonction des noms. La seule chose que je peux penser est que si en quelque sorte de la casse a jeté cela, mais j'en doute.
- Voulez-vous dire une instruction DML plutôt que de DDL @Boueuse?
- Eh bien oui, @Ben une instruction DML tels que SÉLECTIONNEZ
- Votre dernière modification indique que vous n'avez pas accès à la table. Vous pouvez poster indiquer quel est le résultat de
select count(*) from all_tables where owner = 'B2BOWNER' and table_name = 'SSC_PAGE_MAP'
est? Pouvez-vous vous connecter sur le schémaB2BOWNER
etgrant insert on ssc_page_map to <the schema your function is in>
? - Essayez
SELECT * FROM ALL_TAB_COLUMNS WHERE OWNER='B2BOWNER' AND TABLE_NAME='SSC_PAGE_MAP'
. Ce que les noms de colonne sont-ils de retour? - Je ne sais pas comment ouvrir une session dans le schéma et effectuer une telle subvention. Je dois obtenir avec les Administrateurs de bases de données sur que si vous pouvez expliquer comment. Je suis à l'aide de TOAD pour Oracle.
- lorsque j'ai exécuté la requête, j'ai reçu un
Error at line 1 ORA-06550: line 13, column 31: PL/SQL: ORA-00947: not enough values ORA-06550: line 13, column 5: PL/SQL: SQL Statement ignored Script Terminated on line 1.
- Il n'y a pas de différence entre la requête que j'ai posté et celui @Bob.... c'est une étrange erreur à arriver sur une instruction SELECT... je doute que c'est ce que vous avez fait. Si l'une ou l'autre je ou Bob posté retourne 0 lignes, alors vous devez accorder les privilèges appropriés. À en juger par la façon dont cela se passe, je soupçonne fortement que ce soit le cas. De toute façon, vous allez probablement avoir à en parler à vos Administrateurs de bases de données...
- Pour l'erreur d'origine il semble juste comme le nom de la colonne qui est faux, comme l'a déjà suggéré - de l'argument de la fonction des noms, qui vous dit correspondent les colonnes de la table, peut-être le
_nbr
partie ne devrait pas être là pour le%type
, mais seulement vous pouvez interroger le dictionnaire de données à voir. Pour la seconde erreur, il semble que vous disposez des privilèges sur la table accordés par l'intermédiaire d'un rôle, plutôt que directement à votre look jusqu'authid
dans le PL/SQL manuel. - Non, la table d'attributs ont été vérifié et revérifié. Tout est en ordre. Il peut être comme vous l'avez dit et je vais avoir besoin de contacter les Administrateurs de bases de données pour les avoir à m'accorder les autorisations appropriées.
- Ce n'est pas un secret et, puisque vous l'avez demandé, j'ai compris. Ils ont utilisé pour être mélangé mais ma DB IDE (CRAPAUD) ignore la casse et montre tout ce que tous les bouchons. Je n'ai jamais la tête de la casse d'être un problème pour un tableau.
Vous devez vous connecter pour publier un commentaire.
Lors de la création de la TABLE sous
B2BOWNER
, assurez-vous de faire précéder la fonction PL/SQL avec le nom du Schéma; c'est à direB2BOWNER.F_SSC_Page_Map_Insert
.Je ne savais pas jusqu'à ce que les Administrateurs de base de données a fait remarquer. Je pourrais avoir créé la table sous ma racine de l'UTILISATEUR/du SCHÉMA et de la fonction PL/SQL aurait fonctionné.
Le nom de la procédure doivent être en majuscules, tout en créant de la procédure dans la base de données.
Vous pouvez utiliser des minuscules pour votre nom de la procédure, tout en appelant à partir de la classe Java comme:
Dans la base de données le nom de la procédure devrait être:
Cela sert comme une des solutions à ce problème.
grant execute on [package] to [some role that the user has]
et il a soulevé l'erreur de compilation, maisgrant execute on [package] to [user]
et il a compilé amende.vous devez donner la permission de votre db