oracle触发器查询中的问题

Posted

技术标签:

【中文标题】oracle触发器查询中的问题【英文标题】:Problem in oracle trigger query 【发布时间】:2010-01-26 06:05:28 【问题描述】:

谁能告诉我这个查询有什么问题?

create trigger Test_trigger 
   before insert on Test for each row 
   begin select TestSequence.nextval into :new.id from dual; 
end;/

当我运行此查询时,我收到以下错误:

第 1 行出现错误:PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:

; 符号“;”被替换为“文件结尾”以继续。

我正在使用 Oracle 10g 快捷版。

【问题讨论】:

【参考方案1】:

结尾的“/”是 SQL*Plus 语法。您可能正在使用 Oracle Apex 中的 SQL 工具 - 在这种情况下,请省略“/”。

【讨论】:

谢谢。我没有意识到这一点。稍后会在 Apex 中使用 sql 命令时记住这一点。【参考方案2】:

如果您删除末尾的“/”,它应该可以工作。

【讨论】:

奇怪,因为我在 Oracle 10g XE 中测试了您的确切代码(减去“/”),它工作得很好..(当然,我也创建了一个虚拟表和一个序列)。也许您将其用作脚本的一部分,而错误在脚本的其他地方? 请看我上面包含的脚本。【参考方案3】:

这是我要执行的脚本:

drop index TestTableIdx1;
drop index TestIdx1;
drop index TestIdx2;
drop table Test;
drop sequence TestSequence;
drop table TestTable; 

create table TestTable (
  objId      number        NOT NULL,
  type       varchar(16)   NOT NULL,
  title      varchar(192)          ,
  url        varchar(192)          ,
  primary key(objId, type)
);

create table Test (
  id         number        NOT NULL,
  objId      number        NOT NULL,
  type       varchar(16)   NOT NULL, 
  timeslot   timestamp     NOT NULL,
  contextId  number        ,
  pubId      number        NOT NULL,
  category   varchar(24),
  meta       varchar(32),
  pageviews  number        NOT NULL,
  aggrLevel  number        NOT NULL,
  primary key(id)
);

create table Dummy (
  id int NOT NULL,
  primary key(id)
);

create sequence TestSequence 
start with 1 
increment by 1 
nomaxvalue;

create trigger Test_trigger
before insert on Test
for each row
begin
select TestSequence.nextval into :new.id from dual;
end;
/

create index TestTableIdx1 on TestTable (
  objId desc, type asc
);

create index TestIdx1 on Test (
  timeslot desc, objId desc, type asc
);

create index TestIdx2 on Test (
  timeslot desc
);

create index TestIdx3 on Test (
  objId desc, type asc
);

create index TestIdx4 on Test (
  contextId desc
);

【讨论】:

您的脚本运行良好....我使用 sqldeveloper 完全按照上述方式测试了您的代码。 是的,脚本运行得很好。尽管在这种情况下我对此表示怀疑,但这可能是一些奇怪的预言机问题?假设您正在使用 SqlDeveloper,请尝试重新启动它? 谢谢。我尝试运行它两次。我会再尝试。我正在通过 Web 界面运行脚本。不知道我做错了什么!:( 为什么您的索引定义中有“desc”和“asc”? Oracle 索引是双向的。 我再次尝试执行脚本;这次它运行正常!我仍然不知道我以前做错了什么。但我很高兴它有效。:D 感谢 Liao 和 poh 的帮助。

以上是关于oracle触发器查询中的问题的主要内容,如果未能解决你的问题,请参考以下文章

在 Oracle 包/过程/触发器/函数中编写的查询

仅当存在时才触发 DROP (ORACLE) [重复]

oracle中查询表中的触发器,关闭启用操作

oracle中触发器问题

关于oracle触发器问题请教

当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错