首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORA-00933触发器异常- SQL命令未正确结束

ORA-00933触发器异常- SQL命令未正确结束
EN

Stack Overflow用户
提问于 2013-12-17 10:22:16
回答 2查看 1K关注 0票数 1

我有下面的代码,它用错误- SQL命令编译,没有正确结束,在插入标记后创建或替换触发器trg_bc,为每一行声明sumMarks int;noCMarks int;

代码语言:javascript
复制
    begin
      select nbrMarks into noCMarks from Course where idC = :new.idC;

      select count(idC) from Marks where idStd = :new.idStd and idC = :new.idC;

      if (noCMarks = Marks) then
        select sum(Mark) into sumMarks from Marks where idC = :new.idC
        and idStd = :new.idStd;
        select nbrMarks into noCMarks from Course where idC = :new.idC;
      insert into meanbyCourse (idStd, IdC, Mean) values(:new.idStd, :new.idC, sumMarks/ noCMarks);
      end if;
  end;
/
show errors

我不知道这有什么问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-17 12:00:04

此部分出现了一些错误-第26行,因为错误消息指向:

代码语言:javascript
复制
select count (*) into rowcnt from Course where idc =    marks_change_tab(marks_change_tab.last).IdC := :new.IdC and nbrMarks in
(select count(idC) from Marks where idStd = marks_change_tab(marks_change_tab.last).IdStd and idC = marks_change_tab(marks_change_tab.last).IdC := :new.IdC);

你有个任务,:=,在这个过程中,两次。我不太清楚这是怎么回事:

代码语言:javascript
复制
where idc =    marks_change_tab(marks_change_tab.last).IdC := :new.IdC

在子查询中也是一样的。我想你是从上面几行剪下的,而且吃的太多了?如果是的话:

代码语言:javascript
复制
select count (*) into rowcnt
from Course
where idc = marks_change_tab(marks_change_tab.last).IdC 
and nbrMarks in (
  select count(idC)
  from Marks
  where idStd = marks_change_tab(marks_change_tab.last).IdStd
  and idC = marks_change_tab(marks_change_tab.last).IdC
);

也就是说,只需从这些行中删除:= :new.IdC。我并不是真的跟踪您在这里所做的事情,但是由于它在循环中,所以看起来您是指整个过程中的marks_change_tab(i),而不是.last值吗?尽管除非我遗漏了一些东西,否则它只会有一行,这使它有点毫无意义。您不能在SQL语句中引用.last (您将得到PLS-00425错误),因此需要在该循环中的其他select语句中使用i

代码语言:javascript
复制
select count (*) into rowcnt
from Course
where idc = marks_change_tab(i).IdC
and nbrMarks in (
  select count(idC)
  from Marks
  where idStd = marks_change_tab(i).IdStd
  and idC = marks_change_tab(i).IdC
);

if (rowcnt >0) then
  select sum(Mark) into sumOfStdMarks
  from Marks
  where idC =  marks_change_tab(i).idC
  and idStd = marks_change_tab(i).idStd;

  select nbrMarks into nbrOfCourseMarks
  from Marks
  where idC = marks_change_tab(i).idC;

  marks_change_tab(i).mean := sumOfStdMarks/ nbrOfCourseMarks;
else
  marks_change_tab.delete(i);
end if;

(更新后包括delete,来自注释)。但是,如果只有一行,那么最好跳过循环,直接使用:new值。而且没有marks.nbrMarks列;不确定您是否想从course那里得到它?

第二个错误是Rene已经指出的;您试图将单个值(即记录)插入到三列中。如Rene所示,您需要显式地从记录中指定每个值。insert和记录类型都有三列并不重要,它们并不是直接兼容的。您可以以不同的方式声明记录类型:

代码语言:javascript
复制
subtype mbcourse_rec is meanbycourse%rowtype;
type m_change_tab is table of mbcourse_rec;

..。然后你就可以:

代码语言:javascript
复制
insert into meanbyCourse values marks_change_tab(i);

无论如何,这现在已经编译了。

不过,扳机似乎不是解决问题的方法。看起来,使meanByCourse成为一个动态计算值的视图,或者可能是一个物化的视图,或者有一个同时执行插入marksmeanByCourse的计算过程,似乎更容易一些,尽管这样做会出现相同的并发问题。类似地,您可能是从触发器或该触发器所针对的插入之前计算course.nbrMarks,这也可能容易出现并发问题。很难说,但一切似乎都很复杂和混乱。

票数 1
EN

Stack Overflow用户

发布于 2013-12-17 10:33:52

“没有足够的值”意味着要执行insert语句,列列表比值列表长。检查插入语句。可能需要将其更改为:

代码语言:javascript
复制
insert into meanbycourse
   (idstd
   ,idc
   ,mean)
values
   (marks_change_tab(i).idstd
   ,marks_change_tab(i).idc
   ,marks_change_tab(i).stdmean);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20631510

复制
相关文章

相似问题

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