首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发器不工作,如果状态正确

触发器不工作,如果状态正确
EN

Stack Overflow用户
提问于 2015-03-18 18:51:07
回答 2查看 44关注 0票数 0

好的,这可能是一个简单的解决办法,但我似乎找不到问题。我有一张桌子的定义如下:

代码语言:javascript
复制
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'))

我指定了一个触发器,特别是这个:

代码语言:javascript
复制
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;
/

现在,当我尝试插入一行时,让我们假设:

代码语言:javascript
复制
    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'));

我知道这个错误:

代码语言:javascript
复制
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子句。发生什么事了?参数

代码语言:javascript
复制
trunc(next_day(sysdate,1))

正如我在双表上检查后可以说的那样,insert可以在没有触发器的情况下正常工作,所以这不是一个与ddl相关的问题。

感谢您的时间和任何事先提供的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-03-18 19:18:08

的确,NEXT_DAY()在SQL中使用一个数字,但在PL/SQL中不适用于一个数字:

代码语言:javascript
复制
SELECT NEXT_DAY(SYSDATE, 2) FROM dual;

返回:

2015年3月23日下午3:16:11

然而,

代码语言:javascript
复制
BEGIN
    DBMS_OUTPUT.PUT_LINE('Monday: ' || NEXT_DAY(SYSDATE, 2) );
END;
/

引发错误:

错误脚本行: 1-4

因此,在存储过程中,对NEXT_DAY()的第二个参数使用一个字符串

代码语言:javascript
复制
IF trunc(:NEW.Inizio_ptz_aula) < trunc(next_day(sysdate, 'MONDAY'))
票数 1
EN

Stack Overflow用户

发布于 2015-03-18 19:17:23

在nextday语句中替换星期一的1就可以了

代码语言:javascript
复制
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语句工作,而不是在触发器中。

代码语言:javascript
复制
  select next_day(sysdate,1) from dual;
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29130367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档