2017-07-10 46 views
-2

我要調用從包p_name一個過程,但它給了錯誤的標識「NAME」必須聲明爲PL/SQL錯誤:標識符「NAME」必須聲明爲

DECLARE 
    V V_NAME; 
    V1 VARCHAR2(30); 
    v_sql VARCHAR2(4000); 
BEGIN 
    SELECT PROCEDURE_NAME BULK COLLECT INTO V from ALL_PROCEDURES 
    where OBJECT_NAME='p_name'; 

    FOR I IN 1..V.COUNT LOOP 
     name:='p_name'; 
     v_sql:='begin'||name||'.'||V(I)||';'||'END;'; 
     EXECUTE IMMEDIATE v_sql; 
    END LOOP; 
END; 
+1

您在這裏使用的變量'name' name ='p_name'; v_sql:='begin'|| name ||'。|| || V(I)||';'||'END;';'沒有聲明。 – g00dy

+1

另外'begin'|| name'應該是''begin'|| name',並且你需要指定包的所有者,或者其他一些過濾器來確保'owner.object_name.procedure_name'是一個過程並且不會不需要參數等。我會發佈一個固定版本,但這個代碼有太多問題。 –

回答

0

如果這是唯一的問題,它應該是這樣的:

DECLARE 
V V_NAME; 
V1 VARCHAR2(30); 
NAME VARCHAR2(7); 
v_sql VARCHAR2(4000); 
BEGIN 
SELECT PROCEDURE_NAME BULK COLLECT INTO V from ALL_PROCEDURES where 
lower(OBJECT_NAME)='p_name'; 
FOR I IN 1..V.COUNT LOOP 
    name:=' p_name'; 
    v_sql:='begin'||name||'.'||V(I)||';'||'END;'; 
    EXECUTE IMMEDIATE v_sql; 
END LOOP; 
END; 
+0

我做了更改,現在它說無效的sql語句。 – varad

+0

@varad - 現在這是一個新線程的主題,因爲它在這裏不涉及這個。我在這裏可以說的是以下內容 - 這是進入v_sql並試圖進行處理的內容:'begin p_name.procedure_name;結束;' - 這不是一個正確的語法,因爲你的程序可能有參數。 – g00dy

+1

另外,請記住'all_procedures'不僅列出了過程,還列出了函數 - https://docs.oracle.com/cd/B19306_01/server.102/b14237/statviews_2025.htm#i1585339。如果函數的語法不正確。你假設包p_name具有所有的過程和函數,但是如果沒有,那麼它的語法也是錯誤的。 – g00dy

相關問題