Oracle功能和触发器问题

时间:2014-10-10 23:12:27

标签: sql oracle function triggers

我已经被困在这件事上好几天了。请帮忙。

我有一个定义狩猎季节的数据库表:

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。我无法弄清楚我的生活是怎样的。我这样做是错的,还是我在这里错过了一些简单的东西?

1 个答案:

答案 0 :(得分:0)

从两个函数和触发器中删除end;end <object name>;用于同一目的。

大多数工具会自动将光标移动到适当的行。或者,您可以使用以下查询手动查找错误行号:select * from user_errors where name = 'ISVALIDDATE';