创建Oracle存储过程插入数据报ORA-00955对象名已存在错误
问题说明
通过存储过程向emp表插入数据时,执行创建存储过程语句抛出错误:
ORA-00955: name is already used by an existing object
原创建与调用代码如下:
CREATE PROCEDURE proc_insert (p_emp_id IN munber, p_emp_ename IN VARCHAR2, p_emp_job IN VARCHAR2, p_emp_dept IN NUMBER, p_emp_hiredate IN DATE, p_emp_loc IN VARCHAR2) IS BEGIN INSERT INTO emp VALUES (p_emp_id, p_emp_ename, p_emp_job, p_emp_dept, p_emp_hiredate, p_emp_loc); END; EXECUTE proc_insert(33,'rohit','web developer',10,'12-apr-2020','kanpur');
错误原因
- 触发ORA-00955的核心原因:当前Schema下已经存在名为
proc_insert的对象(可能是同名存储过程、表、视图、序列、同义词等任意数据库对象),Oracle不允许同一Schema下的对象重名。 - 代码本身存在额外拼写错误:
p_emp_id的参数类型错写为munber,正确类型应为NUMBER,即使解决重名问题,这个拼写错误也会导致创建失败。 - 调用语句存在隐式转换风险:日期值直接传入字符串
'12-apr-2020',依赖数据库默认NLS日期配置,很容易触发日期格式不匹配错误。
解决方法
- 先排查重名对象,执行以下SQL确认
proc_insert的占用情况:
SELECT object_name, object_type FROM user_objects WHERE object_name = 'PROC_INSERT';
- 根据查询结果处理重名问题:
- 如果旧的同名对象不需要保留,且对象类型是存储过程,可以直接用
CREATE OR REPLACE语法覆盖旧版本,无需手动删除;如果是其他类型对象(比如同名的表),要么修改新存储过程的名称,要么删除旧的重名对象。 - 如果旧的同名对象需要保留,直接给新存储过程修改一个不重复的名称即可,比如改为
proc_emp_insert。
- 如果旧的同名对象不需要保留,且对象类型是存储过程,可以直接用
- 修正代码里的拼写错误、日期隐式转换问题,补充事务提交语句,修正后的完整代码如下:
CREATE OR REPLACE PROCEDURE proc_emp_insert (p_emp_id IN NUMBER, p_emp_ename IN VARCHAR2, p_emp_job IN VARCHAR2, p_emp_dept IN NUMBER, p_emp_hiredate IN DATE, p_emp_loc IN VARCHAR2) IS BEGIN INSERT INTO emp VALUES (p_emp_id, p_emp_ename, p_emp_job, p_emp_dept, p_emp_hiredate, p_emp_loc); COMMIT; END; / -- 显式转换日期格式,避免NLS配置不匹配报错 EXECUTE proc_emp_insert(33,'rohit','web developer',10,TO_DATE('12-apr-2020','dd-mon-yyyy','NLS_DATE_LANGUAGE=AMERICAN'),'kanpur');
内容的提问来源于stack exchange,提问作者Yash Tandon
相关产品推荐
相关产品推荐

