create or replace function getTerm(username_new varchar2(32))
return varchar2(10)
as
begin
     result varchar2(10);
     term number:=1;
 yearCode varchar2(10):=substr(username_new,4,2);
 semesterCode varchar2(10):=substr(username_new,6,1);
 year number:=convert(number,yearCode);
 currentdate date(7):=TO_DATE(to_char(getdate(),'YYYY-MM-DD'),'YYYY-MM-DD');
 currentyear number:=convert(number,to_char(currentdate,'yyyy'));
 lastyear number:=0;
 d date(7):=TO_DATE(to_char(currentdate,'YYYY')+'-'+'03-16','YYYY-MM-DD');
 newTermStartDate date(7);
 lastTermEndDate date(7);
 if currentdate<d then
     lastyear:=1;
     end if;
 if lastyear=1 then
 currentyear:=currentyear-1;
     end if;
     term:=(currentyear-year)*2;
     newTermStartDate:=TO_DATE(to_char(currentdate,'YYYY')+'-09-16','YYYY-MM-DD');
     lastTermEndDate:=TO_DATE(to_char(currentdate,'YYYY')+'-03-16','YYYY-MM-DD');
 if currentdate<newTermStartDate then
    if currentdate>lastTermEndDate then
   term:=term+1;
end if;
 else
term:=term+2;
 end if;
 if semesterCode=2 then
term:=term-1;
 end if;
 result:=convert(varchar2(10),term);
 return result;
end getTerm;
这是我写的sql函数
下面是错误报告:
[Err] ORA-24344: success with compilation error[Err] create or replace function getTerm(username_new varchar2(32))
return varchar2(10)
as
begin
     result varchar2(10);
     term number:=1;
 yearCode varchar2(10):=substr(username_new,4,2);
 semesterCode varchar2(10):=substr(username_new,6,1);
 year number:=convert(number,yearCode);
 currentdate date(7):=TO_DATE(to_char(getdate(),'YYYY-MM-DD'),'YYYY-MM-DD');
 currentyear number:=convert(number,to_char(currentdate,'yyyy'));
 lastyear number:=0;
 d date(7):=TO_DATE(to_char(currentdate,'YYYY')+'-'+'03-16','YYYY-MM-DD');
 newTermStartDate date(7);
 lastTermEndDate date(7);
 if currentdate<d then
     lastyear:=1;
     end if;
[Err] ORA-00900: invalid SQL statement[Err] if lastyear=1 then
 currentyear:=currentyear-1
[Err] ORA-00900: invalid SQL statement[Err] end if
[Err] ORA-00900: invalid SQL statement[Err] term:=(currentyear-year)*2
[Err] ORA-00900: invalid SQL statement[Err] newTermStartDate:=TO_DATE(to_char(currentdate,'YYYY')+'-09-16','YYYY-MM-DD')
[Err] ORA-00900: invalid SQL statement[Err] lastTermEndDate:=TO_DATE(to_char(currentdate,'YYYY')+'-03-16','YYYY-MM-DD')
[Err] ORA-00900: invalid SQL statement[Err] if currentdate<newTermStartDate then
    if currentdate>lastTermEndDate then
   term:=term+1
[Err] ORA-00900: invalid SQL statement[Err] end if
[Err] ORA-00900: invalid SQL statement[Err] else
term:=term+2
[Err] ORA-00900: invalid SQL statement[Err] end if
[Err] ORA-00900: invalid SQL statement[Err] if semesterCode=2 then
term:=term-1
[Err] ORA-00900: invalid SQL statement[Err] end if
[Err] ORA-00900: invalid SQL statement[Err] result:=convert(varchar2(10),term)
[Err] ORA-00900: invalid SQL statement[Err] return result
[Err] ORA-00900: invalid SQL statement[Err] end getTerm
[Msg] Finished - Unsuccessfully

解决方案 »

  1.   

    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2(32))
      RETURN VARCHAR2(10) AS
      RESULT VARCHAR2(10);
      TERM NUMBER := 1;
      YEARCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 4, 2);
      SEMESTERCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 6, 1);
      YEAR NUMBER := CONVERT(NUMBER, YEARCODE);
      CURRENTDATE DATE(7) := TO_DATE(TO_CHAR(GETDATE(), 'YYYY-MM-DD'),
                                     'YYYY-MM-DD');
      CURRENTYEAR NUMBER := CONVERT(NUMBER, TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR NUMBER := 0;
      D DATE(7) := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' + '03-16',
                           'YYYY-MM-DD');
      NEWTERMSTARTDATE DATE(7);
      LASTTERMENDDATE DATE(7);
    BEGIN --变量定义要放在begin前面 AS 后面 晕。
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM             := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16',
                                  'YYYY-MM-DD');
      LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16',
                                  'YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := CONVERT(VARCHAR2(10), TERM);
      RETURN RESULT;
    END GETTERM;
      

  2.   

    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2(32))
    VARCHAR2(32)这里不要制定数据的长度,改为varchar2
      

  3.   

    return varchar2(10) 不能只能长度,只需要指定类型
      

  4.   

    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2)
      RETURN VARCHAR2 AS
      RESULT VARCHAR2(10);
      TERM NUMBER := 1;
      YEARCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 4, 2);
      SEMESTERCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 6, 1);
      YEAR NUMBER := CONVERT(NUMBER, YEARCODE);
      CURRENTDATE DATE(7) := TO_DATE(TO_CHAR(GETDATE(), 'YYYY-MM-DD'),
                                     'YYYY-MM-DD');
      CURRENTYEAR NUMBER := CONVERT(NUMBER, TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR NUMBER := 0;
      D DATE(7) := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' + '03-16',
                           'YYYY-MM-DD');
      NEWTERMSTARTDATE DATE(7);
      LASTTERMENDDATE DATE(7);
    BEGIN 
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM             := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16',
                                  'YYYY-MM-DD');
      LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16',
                                  'YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := CONVERT(VARCHAR2(10), TERM);
      RETURN RESULT;
    END GETTERM;
    还是不行啊[Err] ORA-24344: success with compilation error[Err] CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2)
      RETURN VARCHAR2 AS
      RESULT VARCHAR2(10);
      TERM NUMBER := 1;
      YEARCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 4, 2);
      SEMESTERCODE VARCHAR2(10) := SUBSTR(USERNAME_NEW, 6, 1);
      YEAR NUMBER := CONVERT(NUMBER, YEARCODE);
      CURRENTDATE DATE(7) := TO_DATE(TO_CHAR(GETDATE(), 'YYYY-MM-DD'),
                                     'YYYY-MM-DD');
      CURRENTYEAR NUMBER := CONVERT(NUMBER, TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR NUMBER := 0;
      D DATE(7) := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' + '03-16',
                           'YYYY-MM-DD');
      NEWTERMSTARTDATE DATE(7);
      LASTTERMENDDATE DATE(7);
    BEGIN 
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
    [Err] ORA-00900: invalid SQL statement[Err] IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] TERM             := (CURRENTYEAR - YEAR) * 2
    [Err] ORA-00900: invalid SQL statement[Err] NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16',
                                  'YYYY-MM-DD')
    [Err] ORA-00900: invalid SQL statement[Err] LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16',
                                  'YYYY-MM-DD')
    [Err] ORA-00900: invalid SQL statement[Err] IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] ELSE
        TERM := TERM + 2
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] RESULT := CONVERT(VARCHAR2(10), TERM)
    [Err] ORA-00900: invalid SQL statement[Err] RETURN RESULT
    [Err] ORA-00900: invalid SQL statement[Err] END GETTERM
    [Msg] Finished - Unsuccessfully
      

  5.   


    --
    DATE(7)
    GETDATE()
    USERNAME_NEW---这尼玛是oracle语法么?
      

  6.   


    data类型没有括号
    当前日期用 sysdate
      

  7.   

    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2)
      RETURN VARCHAR2 
      AS
      RESULT VARCHAR2;
      TERM NUMBER := 1;
      YEARCODE VARCHAR2 := SUBSTR(USERNAME_NEW, 4, 2);
      SEMESTERCODE VARCHAR2 := SUBSTR(USERNAME_NEW, 6, 1);
      YEAR NUMBER := CONVERT(NUMBER, YEARCODE);
      CURRENTDATE DATE := TO_DATE(TO_CHAR(sysdate, 'YYYY-MM-DD'),'YYYY-MM-DD');
      CURRENTYEAR NUMBER := CONVERT(NUMBER, TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR NUMBER := 0;
      D DATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' + '03-16','YYYY-MM-DD');
      NEWTERMSTARTDATE DATE;
      LASTTERMENDDATE DATE;
    BEGIN 
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16','YYYY-MM-DD');
      LASTTERMENDDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16','YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := CONVERT(VARCHAR2(10), TERM);
      RETURN RESULT;
    END GETTERM;
    这个还是报错啊 小弟是第一次创建sql函数 菜鸟一枚
      

  8.   

    我把convert换了
    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2)
      RETURN VARCHAR2 
      AS
      RESULT VARCHAR2;
      TERM NUMBER := 1;
      YEARCODE VARCHAR2 := SUBSTR(USERNAME_NEW, 4, 2);
      SEMESTERCODE VARCHAR2 := SUBSTR(USERNAME_NEW, 6, 1);
      YEAR NUMBER := TO_NUMBER(YEARCODE);
      CURRENTDATE DATE := TO_DATE(TO_CHAR(sysdate, 'YYYY-MM-DD'),'YYYY-MM-DD');
      CURRENTYEAR NUMBER := TO_NUMBER(TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR NUMBER := 0;
      D DATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' + '03-16','YYYY-MM-DD');
      NEWTERMSTARTDATE DATE;
      LASTTERMENDDATE DATE;
    BEGIN 
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16','YYYY-MM-DD');
      LASTTERMENDDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16','YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := TO_CHAR(TERM);
      RETURN RESULT;
    END GETTERM;
    这个还是错啊 求大神指点一下迷津
      

  9.   


    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2) RETURN VARCHAR2 AS
      RESULT           VARCHAR2(100); --这里需要长度弟弟,我说的是return 后面的不需要长度
      TERM             NUMBER := 1;
      YEARCODE         VARCHAR2(100) := SUBSTR(USERNAME_NEW, 4, 2); --这里需要长度弟弟,我说的是return 后面的不需要长度
      SEMESTERCODE     VARCHAR2(100) := SUBSTR(USERNAME_NEW, 6, 1); --这里需要长度弟弟,我说的是return 后面的不需要长度
      YEAR             NUMBER := TO_NUMBER(YEARCODE); 
      CURRENTDATE      DATE := TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),
                                       'YYYY-MM-DD');
      CURRENTYEAR      NUMBER := TO_NUMBER(TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR         NUMBER := 0;
      D                DATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-' +
                                       '03-16',
                                       'YYYY-MM-DD');
      NEWTERMSTARTDATE DATE;
      LASTTERMENDDATE  DATE;
    BEGIN
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM             := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16',
                                  'YYYY-MM-DD');
      LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16',
                                  'YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := TO_CHAR(TERM);
      RETURN RESULT;
    END GETTERM;
      

  10.   

    CREATE OR REPLACE FUNCTION getterm(username_new VARCHAR2)
      RETURN VARCHAR2
    参数是不指定长度的。返回也是。
    RESULT VARCHAR2(10);在执行部分不能定义。
     term NUMBER := 1;为定义
    ...............等等。。
    该贴作者是什么意思??
      

  11.   

    CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2) RETURN VARCHAR2 
    AS
      RESULT           VARCHAR2(10);
      TERM             NUMBER;
      YEARCODE         VARCHAR2(10) := SUBSTR(USERNAME_NEW, 4, 2); 
      SEMESTERCODE     VARCHAR2(10) := SUBSTR(USERNAME_NEW, 6, 1); 
      YEAR             NUMBER := TO_NUMBER(YEARCODE); 
      CURRENTDATE      DATE := TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'YYYY-MM-DD');
      CURRENTYEAR      NUMBER := TO_NUMBER(TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR         NUMBER := 0;
      D                DATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY')+ '-03-16','YYYY-MM-DD');
      NEWTERMSTARTDATE DATE;
      LASTTERMENDDATE  DATE;
    BEGIN
      TERM :=1;
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
      IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1;
      END IF;
      TERM             := (CURRENTYEAR - YEAR) * 2;
      NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16','YYYY-MM-DD');
      LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16','YYYY-MM-DD');
      IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1;
        END IF;
      ELSE
        TERM := TERM + 2;
      END IF;
      IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1;
      END IF;
      RESULT := TO_CHAR(TERM);
      RETURN RESULT;
    END GETTERM;还是报错啊[Err] ORA-24344: success with compilation error[Err] CREATE OR REPLACE FUNCTION GETTERM(USERNAME_NEW VARCHAR2) RETURN VARCHAR2 
    AS
      RESULT           VARCHAR2(10);
      TERM             NUMBER;
      YEARCODE         VARCHAR2(10) := SUBSTR(USERNAME_NEW, 4, 2); 
      SEMESTERCODE     NUMBER := TO_NUMBER(SUBSTR(USERNAME_NEW, 6, 1)); 
      YEAR             NUMBER := TO_NUMBER(YEARCODE); 
      CURRENTDATE      DATE := TO_DATE(TO_CHAR(SYSDATE, 'YYYY-MM-DD'),'YYYY-MM-DD');
      CURRENTYEAR      NUMBER := TO_NUMBER(TO_CHAR(CURRENTDATE, 'yyyy'));
      LASTYEAR         NUMBER := 0;
      D                DATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY')+ '-03-16','YYYY-MM-DD');
      NEWTERMSTARTDATE DATE;
      LASTTERMENDDATE  DATE;
    BEGIN
      TERM :=1;
      IF CURRENTDATE < D THEN
        LASTYEAR := 1;
      END IF;
    [Err] ORA-00900: invalid SQL statement[Err] IF LASTYEAR = 1 THEN
        CURRENTYEAR := CURRENTYEAR - 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] TERM             := (CURRENTYEAR - YEAR) * 2
    [Err] ORA-00900: invalid SQL statement[Err] NEWTERMSTARTDATE := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-09-16','YYYY-MM-DD')
    [Err] ORA-00900: invalid SQL statement[Err] LASTTERMENDDATE  := TO_DATE(TO_CHAR(CURRENTDATE, 'YYYY') + '-03-16','YYYY-MM-DD')
    [Err] ORA-00900: invalid SQL statement[Err] IF CURRENTDATE < NEWTERMSTARTDATE THEN
        IF CURRENTDATE > LASTTERMENDDATE THEN
          TERM := TERM + 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] ELSE
        TERM := TERM + 2
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] IF SEMESTERCODE = 2 THEN
        TERM := TERM - 1
    [Err] ORA-00900: invalid SQL statement[Err] END IF
    [Err] ORA-00900: invalid SQL statement[Err] RESULT := TO_CHAR(TERM)
    [Err] ORA-00900: invalid SQL statement[Err] RETURN RESULT
    [Err] ORA-00900: invalid SQL statement[Err] END GETTERM
    [Msg] Finished - Unsuccessfully小弟纯菜鸟 让各位见笑了  这个函数是为了得到学生所在的学期,由于学期是随着时间变化而变化,所以要计算得到
      

  12.   

    这个函数是出统计报表要用到,要求效率,所以没法在程序外部计算,必须在sql中计算并在其他sql中调用