PLS-00103:遇到符号“文件结尾”Sql Developer

Posted

技术标签:

【中文标题】PLS-00103:遇到符号“文件结尾”Sql Developer【英文标题】:PLS-00103: Encountered the symbol "end-of-file" Sql Developer 【发布时间】:2015-05-20 13:57:45 【问题描述】:

我想执行下面的 sql 代码。

--1
CREATE TABLE User_Type(
User_Type_ID Integer NOT NULL PRIMARY KEY,
User_Type_Name Char(20 ) NOT NULL
);

CREATE SEQUENCE User_Type_seq;
CREATE TRIGGER User_Type_ID_trg
BEFORE INSERT ON User_Type
FOR EACH ROW
BEGIN
SELECT User_Type_seq.NEXTVAL INTO :new.User_Type_ID
FROM DUAL;
END;
/

当我手动将它写给 sql developer 时,它可以工作。但我需要很多这样的块。所以,我用记事本++编辑了那些,然后再次复制/粘贴到sql developer。这次;表和序列已创建,但它给出了关于触发代码的错误(我已使用 select from user_errors 执行此例程)

PLS-00103:在预期以下情况之一时遇到符号“文件结尾”:错误 103 ;

这是不起作用的完整代码。创建表和序列代码有效,但触发代码无效。

--1
CREATE TABLE User_Type(
  User_Type_ID Integer NOT NULL PRIMARY KEY,
  User_Type_Name Char(20 ) NOT NULL
);

CREATE SEQUENCE User_Type_seq;
CREATE TRIGGER User_Type_ID_trg
BEFORE INSERT ON User_Type
FOR EACH ROW
BEGIN
SELECT User_Type_seq.NEXTVAL INTO :new.User_Type_ID
FROM DUAL;
END;
/
--2
CREATE TABLE Users(
  User_ID Integer NOT NULL PRIMARY KEY,
  User_Password Char(8 ) NOT NULL,
  User_Name Char(20 ) NOT NULL,
  User_Type_ID Integer NOT NULL
);
CREATE SEQUENCE Users_seq;
CREATE TRIGGER User_ID_trg
BEFORE INSERT ON Users
FOR EACH ROW
BEGIN
SELECT Users_seq.NEXTVAL INTO :new.User_ID
FROM DUAL;
END;
/
--3
CREATE TABLE Admin(
  Admin_ID Integer NOT NULL PRIMARY KEY,
  E_mail Char(20 ) NOT NULL,
  Phone_Number Char(20 ) NOT NULL,
  User_ID Integer NOT NULL
);
CREATE SEQUENCE Admin_seq;
CREATE TRIGGER Admin_ID_trg
BEFORE INSERT ON Admin
FOR EACH ROW
BEGIN
SELECT Admin_seq.NEXTVAL INTO :new.Admin_ID
FROM DUAL;
END;
/
--4
CREATE TABLE City(
  City_ID Integer NOT NULL PRIMARY KEY,
  City_Name Char(20 ) NOT NULL
);


CREATE SEQUENCE City_seq;
CREATE TRIGGER City_ID_trg
BEFORE INSERT ON City
FOR EACH ROW
BEGIN
SELECT City_seq.NEXTVAL INTO :new.City_ID
FROM DUAL;


/

我搜索了类似的问题,但没有任何回应可以解决我的问题。

对不起英文,谢谢...

【问题讨论】:

【参考方案1】:

您只是在最终触发器中缺少END;

CREATE TRIGGER City_ID_trg
BEFORE INSERT ON City
FOR EACH ROW
BEGIN
SELECT City_seq.NEXTVAL INTO :new.City_ID
FROM DUAL;
END;
/

其他一切is already created and compiled successfully。

顺便说一句,从 11g 开始,您可以直接在 PL/SQL 中分配一个序列,而不必从双重选择:

...
BEGIN
  :new.City_ID := City_seq.NEXTVAL;
END;
/

【讨论】:

首先,非常感谢。是的,不幸的是我忘记了“END;”,否则你的代码也不能在 sql developer 3.2 上运行。 @jannissary - 我刚刚挖出 3.2 的副本,从 SQL Fiddle 复制代码,将其粘贴到新工作表中,然后运行正常。您看到了什么错误? 命令中从第 16 行开始的错误:END 错误报告:未知命令。我想问一下您使用哪个JDK以及Oracle数据库的哪个客户端版本?我用过 jdk 1.6.0_45 和 11g @jannissary - JDK 1.6.0_35;甲骨文 11.2.0.3。除非您复制和粘贴不正确,否则我看不到如何获得该错误,或​​者在原始代码中的第一个触发器之后添加END;,这不是我所说的。只有你的最后一个触发器丢失了,它必须在 / 之前。【参考方案2】:

解决了。不幸的是,一个字母错误我还不明白为什么,但是:

应该是

create trigger

而不是

CREATE TRIGGER

【讨论】:

它不区分大小写,即使是它也不会解释您收到的错误消息。我想你一定同时改变了其他东西。很高兴它正在工作。

以上是关于PLS-00103:遇到符号“文件结尾”Sql Developer的主要内容,如果未能解决你的问题,请参考以下文章

PLS-00103:在预期以下之一时遇到符号“文件结尾”

PLS-00103:遇到符号“文件结尾”编译错误

PLS-00103:在简单更新块中遇到符号“文件结尾”

Oracle - PLS-00103:触发器 - 文件结束错误

Oracle SQL PLS-00103 创建包体时出错

PL/SQL 函数错误 - PLS-00103:遇到符号“IS”