2017-01-18 10 views
0

長すぎる私がプロシージャを実行するたびに、それは選択のタイプに従ってカーソルで結果が得られます:ORA-00972:識別子が、私はこのような手順を持っているORA-06512

create or replace PROCEDURE EMAT_PROC_DROPDOWN_SELECTALL(SELECT_TYPE IN VARCHAR2, RESULT_SET OUT SYS_REFCURSOR) 
    AS 
    SELECT_TYPE_IN VARCHAR2(100); 
    TABLE_NAME VARCHAR2(100); 
    FIELD_NAME VARCHAR2(100); 
    C_ZONE SYS_REFCURSOR; 
    C_USER_ID SYS_REFCURSOR; 
BEGIN 
    SELECT_TYPE_IN:=SELECT_TYPE; 
IF(SELECT_TYPE_IN ='ZONE') THEN 
BEGIN 
    TABLE_NAME:='MM_ZONEMASTER'; 
    FIELD_NAME:='ZONE_NAME'; 
    OPEN C_ZONE FOR 
    'SELECT DISTINCT' ||FIELD_NAME|| 'FROM' ||TABLE_NAME||';'; 
    LOOP 
     FETCH C_ZONE INTO RESULT_SET; 
     EXIT WHEN C_ZONE%NOTFOUND; 
    END LOOP; 
    CLOSE C_ZONE; 
END; 
ELSIF(SELECT_TYPE_IN ='USER') THEN 
BEGIN 
    TABLE_NAME:='AD_USERMASTER'; 
    FIELD_NAME:='USER_ID'; 
    OPEN C_USER_ID FOR 
    'SELECT DISTINCT' ||FIELD_NAME|| 'FROM' ||TABLE_NAME||';'; 
    LOOP 
    FETCH C_USER_ID INTO RESULT_SET; 
     EXIT WHEN C_USER_ID%NOTFOUND; 
    END LOOP; 
    CLOSE C_ZONE; 
    END; 
    END IF; 
END; 

が、エラーを返す** * ORA-00972:識別子が長すぎ ORA-06512である: "EMAT.EMAT_PROC_DROPDOWN_SELECTALL"、ライン14 ORA-06512で:ライン7

+0

@JeromeFrあなたの解決策は正しいですが、私がBEGINを実行するとき TABLE_NAME:= 'MM_ZONEMASTER'; FIELD_NAME:= 'ZONE_NAME'; OPEN C_ZONE FOR 'SELECT DISTINCT' || FIELD_NAME || 'FROM' || TABLE_NAME || ';'; ORA-00911:無効な文字です –

答えて

1

でこれが問題である:'SELECT DISTINCT' ||FIELD_NAME|| 'FROM' ||TABLE_NAME||';';

それはとしてそれを見ることができますSELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER

他は同じです。

は、スペースを追加し、不足しているスペースは、フィールド名とテーブル名の周りのカーソルでありSELECT DISTINCT ' ||FIELD_NAME|| ' FROM ' ||TABLE_NAME||';';

0

としてそれを書きます。

'SELECT DISTINCT ' ||FIELD_NAME|| ' FROM ' ||TABLE_NAME||';'; 

をさらにあなたのIFでネストされたブロックを使用することに注意してください:それは役立つはずです。このことにより、その行を置き換え代わりSELECT DISTINCT ZONE_NAME FROM MM_ZONEMASTER;SELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER;を読み込みます。私はそれが必要でないならば、それを乱用するのを避けるだろう。

関連する問題