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

时间:2017-01-18 12:16:15

标签: 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_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行

2 个答案:

答案 0 :(得分:1)

问题是:<li><%= link_to 'New Post', posts_path %></li>

它会将其视为 'SELECT DISTINCT' ||FIELD_NAME|| 'FROM' ||TABLE_NAME||';';

另一个也是如此。

添加空格并将其写为SELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER

答案 1 :(得分:0)

字段名称和表名称周围的光标中缺少空格。它显示SELECT DISTINCTZONE_NAMEFROMMM_ZONEMASTER;而不是SELECT DISTINCT ZONE_NAME FROM MM_ZONEMASTER; 用此替换该行应该有所帮助:

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

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