好的,这可能是一个简单的解决办法,但我似乎找不到问题。我有一张桌子的定义如下:
CREATE TABLE Prenotazione (
Mat_docente char(10),
Nome_sede varchar2(30),
Num_aula varchar2(3),
Tipo_aula varchar2(15),
Motivazione varchar2(20) NOT NULL,
Affluenza NUMBER(3) NOT NULL,
Data_ptz_aula date NOT NULL,
Inizio_ptz_aula date,
Fine_ptz_aula date,
--
CONSTRAINT fk_Prenotazione_docente FOREIGN KEY (Mat_docente) REFERENCES Docente(Mat_docente) ON DELETE CASCADE,
CONSTRAINT fk_Prenotazione_aula FOREIGN KEY (Nome_sede,Num_aula,Tipo_aula) REFERENCES Aula(Nome_sede,Num_aula,Tipo_aula) ON DELETE CASCADE,
CONSTRAINT pk_Prenotazione PRIMARY KEY (Mat_docente,Inizio_ptz_aula,Fine_ptz_aula),
CHECK (trunc(inizio_ptz_aula) = trunc(fine_ptz_aula)), -- data inizio = data fine // prenotazione giornaliera
CHECK ( Inizio_ptz_aula < Fine_ptz_aula ), -- ora inizio < ora fine // coerenza temporale
CHECK (Motivazione in ('Lezione','Seminario','Esercitaz','Esame','Assemblea','Altro'))我指定了一个触发器,特别是这个:
CREATE OR REPLACE TRIGGER Controllo_prenotazione
BEFORE INSERT OR UPDATE ON Prenotazione
FOR EACH ROW
DECLARE
EX_ONE EXCEPTION;
EX_TWO EXCEPTION;
BEGIN
IF trunc(:NEW.Inizio_ptz_aula) < trunc(next_day(sysdate,1))
THEN RAISE EX_ONE;
END IF;
IF to_number(to_char(sysdate,'d'),'9') > 5
THEN RAISE EX_TWO;
END IF;
EXCEPTION
WHEN EX_ONE THEN RAISE_APPLICATION_ERROR(-200011,'Non è possibile prenotare nella settimana corrente');
WHEN EX_TWO THEN RAISE_APPLICATION_ERROR(-200012,'Non è possibile prenotare nel weekend');
END;
/现在,当我尝试插入一行时,让我们假设:
insert into prenotazione values ('1124000003',
'Centro Direzionale',
NULL,
'Aula',
'Lezione',
250,
sysdate,
to_date('28-03-2015 16:30','dd-mm-yyyy hh24:mi'),
to_date('28-03-2015 18:30','dd-mm-yyyy hh24:mi'));我知道这个错误:
ERROR at line 1:
ORA-01846: not a valid day of the week
ORA-06512: at "ADMIN.CONTROLLO_PRENOTAZIONE", line 5
ORA-04088: error during execution of trigger 'ADMIN.CONTROLLO_PRENOTAZIONE'引用第一个IF子句。发生什么事了?参数
trunc(next_day(sysdate,1))正如我在双表上检查后可以说的那样,insert可以在没有触发器的情况下正常工作,所以这不是一个与ddl相关的问题。
感谢您的时间和任何事先提供的帮助。
发布于 2015-03-18 19:18:08
的确,NEXT_DAY()在SQL中使用一个数字,但在PL/SQL中不适用于一个数字:
SELECT NEXT_DAY(SYSDATE, 2) FROM dual;返回:
2015年3月23日下午3:16:11
然而,
BEGIN
DBMS_OUTPUT.PUT_LINE('Monday: ' || NEXT_DAY(SYSDATE, 2) );
END;
/引发错误:
错误脚本行: 1-4
因此,在存储过程中,对NEXT_DAY()的第二个参数使用一个字符串
IF trunc(:NEW.Inizio_ptz_aula) < trunc(next_day(sysdate, 'MONDAY'))发布于 2015-03-18 19:17:23
在nextday语句中替换星期一的1就可以了
CREATE OR REPLACE TRIGGER Controllo_prenotazione
BEFORE INSERT OR UPDATE ON Prenotazione
FOR EACH ROW
DECLARE
EX_ONE EXCEPTION;
EX_TWO EXCEPTION;
BEGIN
IF trunc(:NEW.Inizio_ptz_aula) < trunc(next_day(sysdate,'MONDAY'))
THEN RAISE EX_ONE;
END IF;
IF to_number(to_char(sysdate,'d'),'9') > 5
THEN RAISE EX_TWO;
END IF;
EXCEPTION
WHEN EX_ONE THEN RAISE_APPLICATION_ERROR(-200011,'Non e possibile prenotare nella settimana corrente');
WHEN EX_TWO THEN RAISE_APPLICATION_ERROR(-200012,'Non e possibile prenotare nel weekend');
END;
/这是相当奇怪的行为,因为它作为select语句工作,而不是在触发器中。
select next_day(sysdate,1) from dual;https://stackoverflow.com/questions/29130367
复制相似问题