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行。
/
答案 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;
/