PLS 00103错误:遇到符号:IS,文件结束

时间:2015-10-28 16:33:19

标签: sql function oracle11g

以下查询在执行时出错:PLS 00103.你能帮我找到错误吗?我尝试过像ELSIF这样的其他组合,但都会出错。

CREATE OR REPLACE
  FUNCTION fnExpirationDateCondition
    (
      ExpirDateStr  IN VARCHAR2,
      OptionDateStr IN VARCHAR2 ) // Error 1 here
    RETURN INTEGER ExpirDate DATE; // Error 2 here
    OptionDate TIMESTAMP;
  IS
  BEGIN
    ExpirDate   :=TO_DATE(ExpirDateStr,'YYYY-MM-DD');
    OptionDate  :=TO_TIMESTAMP(OptionDateStr, 'YYYY-MM-DD HH24:MI:SS.FF');
    IF(ExpirDate > OptionDate) THEN
      RETURN 1;
    ELSE
      IF(ExpirDate < OptionDate) THEN // Error 3 here
        RETURN -1;
      ELSE
        RETURN 0;
      END IF;
    END IF;
  END;

错误:
1.)当期待以下之一时遇到符号“ExpirDate”:
2.)在期待以下之一时遇到符号“IS”:
3.)当期待以下之一时遇到符号“文件结束”:

我还尝试用ExpirDate :=TO_DATE(ExpirDateStr,'YYYY-MM-DD')替换TO_DATE(ExpirDateStr,'YYYY-MM-DD') INTO ExpirDate。它似乎不起作用。

任何建议都会非常有用。

1 个答案:

答案 0 :(得分:2)

问题在于,您已经在标记函数声明部分开头的IS之前发生了变量声明。

试试这个,而不是:

create or replace function fnexpirationdatecondition
    (expirdatestr  in varchar2,
     optiondatestr in varchar2)
return integer 
is
  expirdate date;
  optiondate timestamp;
begin
  expirdate := to_date(expirdatestr,'YYYY-MM-DD');
  optiondate := to_timestamp(optiondatestr, 'YYYY-MM-DD HH24:MI:SS.FF');

  if(expirdate > optiondate) then
    return 1;
  elsif(expirdate < optiondate) then
    return -1;
  else
    return 0;
  end if;
end fnexpirationdatecondition;
/

或者,你可以只有一个return语句(推荐),只需使用case语句来处理if-elsif-else逻辑:

create or replace function fnexpirationdatecondition
    (expirdatestr  in varchar2,
     optiondatestr in varchar2)
return integer 
is
  expirdate date;
  optiondate timestamp;
begin
  expirdate := to_date(expirdatestr,'YYYY-MM-DD');
  optiondate := to_timestamp(optiondatestr, 'YYYY-MM-DD HH24:MI:SS.FF');

  return case when (expirdate > optiondate) then 1
              when (expirdate < optiondate) then -1
              else 0
         end;
end fnexpirationdatecondition;
/