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)
我有一个扳机问我

  • 如果一个emp在一个项目上工作超过50小时,它就不能被放在2个项目上

  • 如果环境管理计划在2个项目上的工作时间超过70小时,则不能与3个项目相关联

  • emp最多只能与6个项目关联

  • 对不起,我只是在学习如何制作触发器。我在select语句附近出错:

    错误(8,6):PLS-00103:预期时遇到符号“选择” 以下选项之一:(+case mod new not null) 持续 当前平均计数存在最大最小之前sql STDEV和方差 执行所有合并时间时间戳间隔日期管道有许多错误:

    • 您尚未声明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?不是吗拼写上很抱歉,这只是一个临时翻译。@ToniRossi
    SELECT
    在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');