以下查询在执行时出错: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
。它似乎不起作用。
任何建议都会非常有用。
答案 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;
/