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';
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é.
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.
vous devriez donner la permission sur votre db
grant execute on (packageName or tableName) to user;