2013-07-17 73 views
0

我的oracle中有UserA和UserB。Oracle EXECUTE IMMEDIATE錯誤

這從用戶A的包:

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是來自用戶B;

當我運行它,我得到的錯誤:

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

+0

這裏是引用錯誤... – kpater87

回答

1

用戶需要在userb.procB的EXECUTE權。

授予權作爲用戶B:

grant execute on UserB.procB to userA; 
+0

我使用這個:授予執行任何程序;謝謝! – suuuch

0

,除非它是作爲一個參數提供時,過程名稱需要字符串作爲一個固定值內;你有它外面,所以它試圖解釋爲一個變量名,它不存在:

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

但你不會需要它EXECUT動態反正,你可以只是做:

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

如果你傳遞的過程作爲一個變量,這將是一個有點古怪,你會碰到這樣的:

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; 

...你會打電話來,作爲procA('UserB.procB')。我不認爲這就是你想要做的,但它不是很清楚。

在這兩種情況下,你似乎都沒有定義l_v1l_v2,所以我猜你剛剛錯過了那部分代碼。

相關問題