下面创建民族编号自增代码在ISQLPLUS执行后,就提示:
警告: 创建的函数带有编译错误。检查了好久还是检查不出原因麻烦各位了!
CREATE OR REPLACE FUNCTION funNationNo()
return char
is
  x number;
  varNationNo1 char(3);   /*最大民族编号*/
  varNationNo2 char(3);  /*新的民族编号*/
BEGIN
  varNationNo1 :='';
  SELECT NVL(max(NationNo),'0') into varNationNo1
  FROM DCNation;   /*若nvl里第一个参数值为空,则取第二个参数值*/
  IF varNationNo1='0' THEN  /*民族字典无记录,编号从001开始*/
    varNationNo2 := '001';
  ELSE /*最大编号值加1*/
    x := to_number(varNationNo1)+1;
  END IF;
  IF x<10 THEN
    varNationNo2 := '00'||ltrim(to_char(x));
  ELSIF x<100 THEN
    varNationNo2 := '0'||ltrim(to_char(x));
  ELSE
    varNationNo2 := ltrim(to_char(x));
  END IF;
  RETURN(varNationNo2);
END funNationNo;

解决方案 »

  1.   

    oracle一点也不万恶哈~~~--1、函数名后,如果没有参数,不要加()
    --2、使用varchar2代替char(这个并不是错误,但建议这样做)
    CREATE OR REPLACE FUNCTION funNationNo RETURN VARCHAR IS
      x            NUMBER;
      varNationNo1 VARCHAR(3); /*最大民族编号*/
      varNationNo2 VARCHAR(3); /*新的民族编号*/
    BEGIN
      varNationNo1 := '';
      SELECT NVL(MAX(NationNo), '0') INTO varNationNo1 FROM DCNation; /*若nvl里第一个参数值为空,则取第二个参数值*/
      IF varNationNo1 = '0' THEN
        /*民族字典无记录,编号从001开始*/
        varNationNo2 := '001';
      ELSE
        /*最大编号值加1*/
        x := to_number(varNationNo1) + 1;
      END IF;
      IF x < 10 THEN
        varNationNo2 := '00' || ltrim(to_char(x));
      ELSIF x < 100 THEN
        varNationNo2 := '0' || ltrim(to_char(x));
      ELSE
        varNationNo2 := ltrim(to_char(x));
      END IF;
      RETURN(varNationNo2);
    END funNationNo;
      

  2.   

    谢谢你啦~tangren
    请问一下你用的是什么软件来设计ORACLE代码的啊?