Oracle执行删表匿名块后建表报PLS-00103错误如何解决?
问题原因
- PL/SQL块缺少结束标识:
BEGIN...END包裹的是PL/SQL匿名块,块结束后必须加单独一行的/作为执行标记,否则Oracle会将后续的CREATE语句识别为PL/SQL块的内容,而PL/SQL语法不允许直接写DDL语句,因此抛出PLS-00103错误。 - 删除语句的表名写法错误:
EXECUTE IMMEDIATE 'DROP TABLE ' || EMPLOYEE中EMPLOYEE和ADDRESS没有加单引号,Oracle会将其识别为未定义的变量而非表名字符串,即使修复了结束符也会运行报错。 - 建表顺序不符合外键依赖:
EMPLOYEE表的AddressID字段依赖ADDRESS表的主键,现有代码先创建EMPLOYEE表时,ADDRESS表还不存在,外键约束会创建失败。
解决方法
针对当前两张表的场景,修复后的可运行代码如下:
-- 删除表的PL/SQL块 BEGIN EXECUTE IMMEDIATE 'DROP TABLE EMPLOYEE'; EXECUTE IMMEDIATE 'DROP TABLE ADDRESS'; EXCEPTION WHEN OTHERS THEN -- 忽略表不存在的错误 IF SQLCODE != -942 THEN RAISE; END IF; END; / -- 先建被依赖的ADDRESS表 CREATE TABLE ADDRESS( AddressID int, Street varchar(225), City varchar(225), State varchar(225), Zip int, PRIMARY KEY (AddressID) ); -- 再建EMPLOYEE表 CREATE TABLE EMPLOYEE( EmployeeID int, FirstName varchar(225), LastName varchar(255), Position varchar(255), SSN int, Address varchar(255), Phone int, AddressID int, PRIMARY KEY (EmployeeID), FOREIGN KEY (AddressID) REFERENCES ADDRESS(AddressID) );
如果需要实现自动删除当前用户下所有表再重建的通用能力,可先查询USER_CONSTRAINTS禁用所有外键约束,避免删除时因依赖报错,再遍历USER_TABLES批量执行DROP语句,最后按依赖顺序执行所有建表逻辑即可。
内容的提问来源于stack exchange,提问作者SomeoneLearning17
相关产品推荐
相关产品推荐

