Oracle Live SQL执行Person表相关SQL时报ID_NO无效标识符、名称被占用问题
报错根因定位
两个报错为连锁触发关系,核心诱因有两点:
- 表名占用连锁触发无效标识符报错:系统提示“名称已被现有对象占用”,代表当前数据库实例中已经存在名为
person的表,CREATE TABLE语句因表名冲突直接执行失败,后续执行的INSERT、SELECT语句基于未成功创建的表逻辑运行,引用的ID_NO字段无对应实体,就会抛出“无效标识符”错误。 - 大小写规则匹配失败触发的无效标识符报错:如果之前手动创建
person表时,为字段名加了双引号并写为小写形式(如"id_no" varchar(15)),Oracle数据库会对带双引号的标识符保留原大小写存储;后续写SQL时不加双引号使用ID_NO,Oracle会自动将其转为大写ID_NO匹配字段,和存储的小写字段名无法对齐,同样会触发无效标识符报错。
修复方案
- 第一步清理残留冲突对象,释放表名占用,执行命令:
DROP TABLE person CASCADE CONSTRAINTS PURGE; - 修正原SQL的兼容性问题后重新运行:原SQL中直接传入字符串格式的日期值,会依赖数据库会话的日期配置做隐式转换,容易触发类型匹配错误,需要显式指定日期转换逻辑。
修正后的完整可执行SQL:
CREATE TABLE person( ID_NO varchar(15), datelend DATE, CONSTRAINT person_name_PK PRIMARY KEY(ID_NO) ); -- 显式指定日期格式,规避隐式转换报错 INSERT INTO person(ID_NO,datelend) VALUES('sahil', TO_DATE('2018-01-25','YYYY-MM-DD')); SELECT * FROM person;
执行完上述语句即可正常完成表创建、数据插入、结果查询,不会再触发相关报错。
内容的提问来源于stack exchange,提问作者mittal_sahil
相关产品推荐
相关产品推荐

