PLS-00103在触发器中

时间:2014-05-20 14:55:59

标签: sql oracle triggers

   CREATE OR REPLACE TRIGGER comprobarHora 
    BEFORE INSERT 
    ON PEDIDOS 
    FOR EACH ROW
declare
    v_data int(4);
    v_dia varchar(20);
begin 
    select to_char(sysdate,'hh24mi') into v_data from dual;
    select to_char(sysdate, 'day') into v_dia from dual;

    if ((v_data BETWEEN (2031, 0830)) OR (v_dia='saturday') OR (v_dia='sunday')) then
        raise_application_error(-20001,' No hi ha estoc');
    end if;
end;

有人可以帮我这个,错误信息是关于第8行。

/

1 个答案:

答案 0 :(得分:0)

当前问题出现在PL / SQL部分的第8行(不是整个语句),即:

if ((v_data BETWEEN (2031, 0830)) OR (v_dia='saturday') OR (v_dia='sunday')) then

这不是指定the BETWEEN condition的方式,应该是:

if v_data BETWEEN 2031 and 0830 OR v_dia='saturday' OR v_dia='sunday' then

但是这仍然不会起作用,因为必须先使用较低的值(“如果expr3< expr2,则间隔为空”)。无论如何,你没有处理过午夜的时间。你可以测试一下:

if v_data >= 2031 OR v_data <= 0830 OR v_dia='saturday' OR v_dia='sunday' then

或交换BETWEEN条件并否定它:

if NOT (v_data BETWEEN 0830 and 2031) OR v_dia='saturday' OR v_dia='sunday' then

正如Gordon Lindoff指出的那样,你将字符串存储在数字字段中,因此你正在进行隐式转换。如果你想把'时间'作为一个数字,你应该明确地转换它。您可能还应确保使用the third parameter to to_char以您期望的语言返回日期名称;并且默认情况下填充日期名称,因此使用缩写更简单。

CREATE OR REPLACE TRIGGER comprobarHora 
    BEFORE INSERT 
    ON PEDIDOS 
    FOR EACH ROW
declare
    v_data int(4);
    v_dia varchar(20);
begin 
    v_data := to_number(to_char(sysdate,'hh24mi'));
    v_dia := to_char(sysdate, 'dy', 'NLS_DATE_LANGUAGE=ENGLISH');

    if v_data >= 2031 OR v_data <= 0830 OR v_dia='sat' OR v_dia='sun' then
        raise_application_error(-20001,' No hi ha estoc');
    end if;
end;
/