You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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日期配置,很容易触发日期格式不匹配错误。
解决方法
  1. 先排查重名对象,执行以下SQL确认proc_insert的占用情况:
SELECT object_name, object_type 
FROM user_objects 
WHERE object_name = 'PROC_INSERT';
  1. 根据查询结果处理重名问题:
    • 如果旧的同名对象不需要保留,且对象类型是存储过程,可以直接用CREATE OR REPLACE语法覆盖旧版本,无需手动删除;如果是其他类型对象(比如同名的表),要么修改新存储过程的名称,要么删除旧的重名对象。
    • 如果旧的同名对象需要保留,直接给新存储过程修改一个不重复的名称即可,比如改为proc_emp_insert。
  2. 修正代码里的拼写错误、日期隐式转换问题,补充事务提交语句,修正后的完整代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.02 11:15:48