Oracle PL/SQL创建存储过程提示名称已被现有对象占用问题
问题修复方案
1. 「Name already used in existing object」报错原因
你将存储过程命名为TRIPS,和你要查询的表TRIPS重名。Oracle同一Schema下,所有对象(表、存储过程、视图、函数等)的名称不允许重复,因此系统判定名称已被占用抛出报错,和游标、字段没有关系。
解决方法就是修改存储过程的名称,比如改为GET_TRIP_DETAIL即可消除该报错。
2. 代码逻辑错误修复
你的代码还存在变量未定义的问题:你声明的入参是Trip_ID,但后续过滤、输出时用的是从未定义过的T_INFO变量,即便解决了名称冲突也无法正常执行。
修正后的完整代码如下:
CREATE OR REPLACE PROCEDURE GET_TRIP_DETAIL(P_TRIP_ID IN NUMBER) IS CURSOR Trips_CURSOR IS SELECT * FROM TRIPS WHERE TRIPS_ID = P_TRIP_ID; BEGIN DBMS_OUTPUT.PUT_LINE('The ID of this trip is ' || P_TRIP_ID); FOR T_ROW IN Trips_CURSOR LOOP DBMS_OUTPUT.PUT_LINE('The Date of the trip is ' || T_ROW.DATE_OF_TRIP); DBMS_OUTPUT.PUT_LINE('The Destination town of the Trip ' || T_ROW.Destination_Town); DBMS_OUTPUT.PUT_LINE('The Source town is ' || T_ROW.Source_Town); END LOOP; END; /
主要修改点:
- 存储过程重命名为
GET_TRIP_DETAIL,解决与TRIPS表的名称冲突问题 - 入参重命名为
P_TRIP_ID,前缀P标识为参数,避免和表字段TRIPS_ID产生命名歧义 - 删除了未定义变量
T_INFO的所有引用,统一使用入参P_TRIP_ID做数据过滤和输出 - 移除了冗余的
T_ROW变量声明,Oracle PL/SQL的FOR循环遍历游标时会自动声明该行类型变量,无需额外定义
执行测试方法
执行存储过程前先开启输出开关:
SET SERVEROUTPUT ON;
调用存储过程查询指定ID的行程信息,示例(将123替换为你要查询的实际Trip ID):
EXEC GET_TRIP_DETAIL(123);
内容的提问来源于stack exchange,提问作者SGA-AllStar
相关产品推荐
相关产品推荐

