2017-07-10 8 views
-2

私は、パッケージP_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:= 'p_name'という変数を使用します。 v_sql:= 'begin' ||名前|| '。' || V(I)|| ';' || 'END;'; 'は宣言されていません。 – g00dy

+1

また、 '' begin '|| name'は '' begin' || name'でなければなりません。パッケージオーナーと、他のフィルタを指定する必要があります。 'owner.object_name.procedure_name'は手続きであり、パラメータが必要です。私は固定バージョンを投稿しますが、このコードには多すぎる問題があります。 –

答えて

0

宣言されなければならない識別子「NAME」などのエラーが発生します

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

関連する問題