2017-01-18 4 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 DISTINCTZONE_NAMEFROMMM_ZONEMASTER; вместо SELECT DISTINCT ZONE_NAME FROM MM_ZONEMASTER; Заменить эту линию, это должно помочь:

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

Кроме того, будьте осторожны с использованием вложенных блоков в вашем IF. Я бы не стал злоупотреблять им, если это не нужно.