Oracle11g ORA-00972:标识符太长ORA-06512

Oracle11g ORA-00972:标识符太长ORA-06512,oracle11g,Oracle11g,我有一个这样的过程,每当我执行该过程时,它将根据选择类型给出游标结果: 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_ZON

我有一个这样的过程,每当我执行该过程时,它将根据选择类型给出游标结果:

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:在第14行的“EMAT.EMAT\u PROC\u下拉列表\u SELECTALL”中
ORA-06512:在第7行

这是一个问题:
从“|表|名称| |”中选择不同的“| |字段| | |”

它会将其视为
SELECT DISTINCTZONE\u NAMEFROMMM\u ZONEMASTER

另一个也一样


添加空格并将其写成
从“|表|名称|”中选择不同的“|字段|名称| |”

字段名和表名周围的光标中缺少空格。它的内容是
从mm\u ZONEMASTER中选择DISTINCTZONE\u name而不是
从MM_ZONEMASTER中选择不同的区域名称
将该行替换为以下内容:

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

此外,在IF中使用嵌套块时要小心。如果不需要,我会避免滥用它。

@JeromeFr您的解决方案是正确的,但当我执行BEGIN TABLE_NAME:='MM_ZONEMASTER';字段名称:=“区域名称”;打开C|u区域,从“|表| u名称|”中选择不同的“|字段|名称|”;ORA-00911:无效字符