Oracle 触发器不编译
我有一个这样制作的数据库Oracle 触发器不编译,oracle,plsql,triggers,Oracle,Plsql,Triggers,我有一个这样制作的数据库 works_on(ssn,project_number,hours) 我有一个扳机问我 如果一个emp在一个项目上工作超过50小时,它就不能被放在2个项目上 如果环境管理计划在2个项目上的工作时间超过70小时,则不能与3个项目相关联 emp最多只能与6个项目关联 对不起,我只是在学习如何制作触发器。我在select语句附近出错: 错误(8,6):PLS-00103:预期时遇到符号“选择” 以下选项之一:(+case mod new not null) 持续 当前
works_on(ssn,project_number,hours)
我有一个扳机问我
- 您尚未声明PL/SQL
变量hours
- 您正在
语句中使用IF
SELECT
语句没有SELECT
子句INTO
- 您正在选择所有的
和ssn
,并且没有将其与插入的行关联的筛选器project\u编号
- 您在
和worsk\u on
中有拼写错误porject\u number
- 第三个
无效,因为您不在计数(项目编号)
语句中SELECT
- 您有
和elsif
语句,但没有相应的else
语句(正如您用IF
关闭之前的语句一样)END IF
可能还有更多(例如,如果您修复了所有这些问题,那么当您在插入的表上进行聚合时,我希望您会得到一个变异表异常。)
end if;elsif
=>elseif
我使用的是sql developer,如果我键入的不是蓝色单词yes,elsif
是正确的术语。不要在elsif
之前用end if;
终止if
语句,这就是重点。除了错误的end if/elsif
语法之外,您的主要问题是,在Oracle中,在表上的触发器(例如works_on)中,无法在同一个表(works_on)上执行SELECT
语句。一旦解决语法错误并避免(请参阅)然后,异常块中出现了一个问题。特别是没有剩余的小时数和太多的项目将导致Oracle提出ORA-21000:参数超出范围异常。必须使用介于-20999和-20000之间的错误号。我必须从表中获取数据,并查看我的条件是否满足。我如何使用select so进行if?不是吗拼写上很抱歉,这只是一个临时翻译。@ToniRossiSELECT
在PL/SQL中无效,除非它有INTO
或BULK COLLECT INTO
子句或在游标内。您可能需要从表中获取值,但操作不正确。您是对的,我以前从未触发过。我正在尝试我仍然不知道如何从表中获取值并将其放入pl/sql“我仍然不知道如何从表中获取值并将其放入pl/sq”看看文档:
create or replace trigger exe
before insert on worsk_on
for each row
declare
too_much_hours EXCEPTION;
no_hours_left EXCEPTION;
too_projects EXCEPTION;
begin
if hours>100
then raise too_much_hours;
end if;
elsif (select count(project_number),ssn,sum(hours) from worsk_on
where count(project_number) > 1 and (sum(hours)>100)
group by ssn,project_number)
then raise no_hours_left;
end if;
else count( porject_number)>6
then raise too_projects;
end if;
EXCEPTION
when too_much_hours then raise_application_error(-20000,'ore progetto sature');
when no_hours_left then raise_application_error(-19000,'ore progetti sature');
when too_projects then raise_application_error(-15151,'ore progetti sature');