【问题标题】:ORA-00972: identifier is too long ORA-06512ORA-00972: 标识符太长 ORA-06512
【发布时间】:2017-01-18 12:16:15
【问题描述】:

我有一个这样的程序,每当我执行该程序时,它都会根据选择类型在光标中给出结果:

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: identifier is too long ORA-06512: 在“EMAT.EMAT_PROC_DROPDOWN_SELECTALL”,第 14 行 ORA-06512: 在第 7 行

【问题讨论】:

  • @JeromeFr 您的解决方案是正确的,但是当我执行 BEGIN TABLE_NAME:='MM_ZONEMASTER'; FIELD_NAME:='ZONE_NAME';打开 C_ZONE FOR 'SELECT DISTINCT' ||FIELD_NAME|| '来自'||表名||';'; ORA-00911: 无效字符

标签: oracle11g


【解决方案1】:

这是问题所在: 'SELECT DISTINCT' ||FIELD_NAME|| 'FROM' ||TABLE_NAME||';';

它将被视为SELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER

另一个也一样。

加空格写成SELECT DISTINCT ' ||FIELD_NAME|| ' FROM ' ||TABLE_NAME||';';

【讨论】:

    【解决方案2】:

    字段名和表名周围的光标缺少空格。它读取 SELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER; 而不是 SELECT DISTINCT ZONE_NAME FROM MM_ZONEMASTER; 用这个替换那行应该会有所帮助:

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

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

    【讨论】:

      猜你喜欢
      • 2012-12-22
      • 2020-07-15
      • 1970-01-01
      • 2011-02-16
      • 2012-07-09
      • 1970-01-01
      • 2017-12-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多