我已经被困在这件事上好几天了。请帮忙。
我有一个定义狩猎季节的数据库表:
create table season(
season varchar2(6) not null,
start_date date not null,
end_date date not null,
constraint pk_season primary key (season)
);
有一个外部程序允许最终用户更新此数据库中的值。但是,在更新“开始日期”时,此外部程序不会对日期格式进行任何检查。或者' end_date'列。为了解决这个问题,我试图创建一个接受输入的触发器,并应用Oracle的TO_DATE
函数。
在触发之前,我创建了两个函数来验证两件事:1)输入的日期是MM/DD/YYYY
格式和2)以确保end_date
在{{1}之后}}
我无法让这些功能正常运行。我可能在某处遇到语法错误,因为我在使用Oracle中的触发器和函数时非常陌生。这就是我所拥有的:
start_date
当我单独尝试其中任何一项时,我会create or replace function isValidDate(input_date in varchar2) return boolean
is
v_date date;
v_diff number;
begin
select to_date(input_date, 'MM/DD/YYYY') into v_date from dual;
return true;
exception when others then
return false;
end;
end isValidDate;
/
create or replace function isValidDateRange(in_start in varchar2, in_end in varchar2) return boolean
is
v_diff number;
begin
select to_date(in_end, 'MM/DD/YYYY') - to_date(in_start, 'MM/DD/YYYY') into v_diff from dual;
if v_diff >= 0
return true;
else
return false;
end if;
end;
end isValidDateRange;
/
create trigger date_format
before insert or update on season
for each row
begin
if isValidDate(:NEW.start_date) then
if isValidDateRange(:NEW.start_date, :NEW.end_date) then
:NEW.start_date := TO_DATE(:NEW.start_date, 'MM/DD/YYYY');
else
raise_application_error(-20100, 'End date must be AFTER Start date');
end if;
else
raise_application_error(-20099, 'Date must be in MM/DD/YYYY format');
end if;
if isValidDate(:NEW.end_date) then
if isValidDateRange(:NEW.start_date, :NEW.end_date) then
:NEW.end_date := TO_DATE(:NEW.end_date, 'MM/DD/YYYY');
else
raise_application_error(-20100, 'End date must be AFTER Start date');
end if;
else
raise_application_error(-20099, 'Date must be in MM/DD/YYYY format');
end if;
end;
end date_format;
/
当我Warning: Function created with compilation errors.
时,它会告诉我SHOW ERRORS
。我无法弄清楚我的生活是怎样的。我这样做是错的,还是我在这里错过了一些简单的东西?
答案 0 :(得分:0)
从两个函数和触发器中删除end;
。 end <object name>;
用于同一目的。
大多数工具会自动将光标移动到适当的行。或者,您可以使用以下查询手动查找错误行号:select * from user_errors where name = 'ISVALIDDATE';