2013-07-17 7 views
0

Il y a UserA et UserB dans mon oracle.Oracle EXECUTE IMMEDIATE erreur

C'est le paquet de UserA:

CREATE OR REPLACE PACKAGE BODY pkgA AS 
    PROCEDURE procA 
    AS 
     l_sql = 'BEGIN ' || UserB.procB || (:l_v1,:l_v2) END;'; 
     EXECUTE IMMEDIATE l_sql USING IN l_v1,IN l_v2; 
    END; 

Thie procB est venu de UtilisateurB;

Quand je cours, j'obtiens l'erreur:

PLS-00201:IDENTIFIER 'UserB.procB' must be declared;

+0

Voici une erreur avec les guillemets ... – kpater87

Répondre

1

utilisateur A besoin Execute droite sur la util_b.procb.

accorder le droit comme utilisateur B:

grant execute on UserB.procB to userA; 
+0

J'utilise ceci: grant exécuter n'importe quelle procédure; Merci! – suuuch

0

moins qu'il ne soit fourni en tant que paramètre, le nom de la procédure doit être à l'intérieur de la chaîne comme une valeur fixe; vous avez à l'extérieur donc il essaie d'être interprété comme un nom de variable, qui n'existe pas:

l_sql = 'BEGIN UserB.procB(:l_v1,:l_v2) END;'; 

Mais alors vous aurait pas besoin de EXECUT dynamiquement de toute façon, vous pouvez simplement faire:

PROCEDURE ProcA AS 
BEGIN 
    UserB.procB(l_v1, l_v2); 
END; 

Si vous passez la procédure comme une variable, ce qui serait un peu étrange, vous auriez quelque chose comme:

PROCEDURE procA (proc_name in varchar2) AS 
BEGIN 
    l_sql = 'BEGIN ' || proc_name || '(:l_v1,:l_v2) END;'; 
    EXECUTE IMMEDIATE l_sql USING IN l_v1,IN l_v2; 
END; 

... et vous appelleriez que procA('UserB.procB'). Je ne pense pas que ce soit ce que vous essayez de faire, mais ce n'est pas tout à fait clair.

Dans les deux cas, vous ne semblez pas avoir défini l_v1 ou l_v2, donc je suppose que vous avez manqué cette partie du code.