Oracle中调用存储过程出现PLS-00201错误的技术求助
解决Oracle存储过程调用时PLS-00201错误
问题场景
尝试创建存储过程p_reproc_tickets调用另外两个存储过程p_Qtd_ticket_dia和p_Qtd_ticket_mes,创建代码如下:
CREATE OR REPLACE PROCEDURE p_reproc_tickets(p_Dta_Processo IN OUT DATE, p_Cod_Loja_Ini IN OUT NUMBER, p_Status OUT VARCHAR2, p_Retorno OUT VARCHAR2) IS l_Cod_loja number; l_p_Data date; l_p_Mes number; BEGIN l_Cod_loja := p_Cod_Loja_Ini; l_p_Data := p_Dta_Processo; l_p_Mes := To_Number('1' || To_Char(Trunc(p_Dta_Processo), 'RRMM')); p_Qtd_ticket_dia(l_Cod_loja, l_p_Data, l_p_Data); P_Qtd_ticket_mes(l_Cod_loja, l_p_Mes); EXCEPTION WHEN OTHERS THEN p_Status := '0'; p_Retorno := SQLERRM; END;
执行时出现错误:
Error: PLS-00201: identifier 'P_QTD_TICKET_DIA' must be declared Line: 17 Text: p_Qtd_ticket_dia(l_Cod_loja, l_p_Data, l_p_Data); Error: PL/SQL: Statement ignored Line: 17 Text: p_Qtd_ticket_dia(l_Cod_loja, l_p_Data, l_p_Data); Error: PLS-00201: identifier 'P_QTD_TICKET_MES' must be declared Line: 19 Text: p_Qtd_ticket_mes(l_Cod_loja, l_p_mes); Error: PL/SQL: Statement ignored Line: 19 Text: p_Qtd_ticket_mes(l_Cod_loja, l_p_mes);
错误原因与解决步骤
PLS-00201错误表示Oracle无法定位被调用的存储过程,可按以下步骤排查解决:
确认存储过程已创建且有效
执行以下查询检查目标存储过程是否存在:SELECT object_name, status FROM user_objects WHERE object_name IN ('P_QTD_TICKET_DIA', 'P_QTD_TICKET_MES') AND object_type = 'PROCEDURE';- 若查询无结果:需先创建
p_Qtd_ticket_dia和p_Qtd_ticket_mes存储过程。 - 若存储过程存在但
status为INVALID:重新编译存储过程:ALTER PROCEDURE p_Qtd_ticket_dia COMPILE; ALTER PROCEDURE p_Qtd_ticket_mes COMPILE;
- 若查询无结果:需先创建
检查权限与用户架构
如果目标存储过程属于其他用户:- 调用时添加用户前缀,例如:
other_schema.p_Qtd_ticket_dia(l_Cod_loja, l_p_Data, l_p_Data); - 确保当前用户拥有执行权限:
GRANT EXECUTE ON other_schema.p_Qtd_ticket_dia TO current_user; GRANT EXECUTE ON other_schema.p_Qtd_ticket_mes TO current_user;
或者创建同义词简化调用:
CREATE SYNONYM p_Qtd_ticket_dia FOR other_schema.p_Qtd_ticket_dia; CREATE SYNONYM p_Qtd_ticket_mes FOR other_schema.p_Qtd_ticket_mes;- 调用时添加用户前缀,例如:
排查命名大小写问题
Oracle默认将标识符转为大写,但如果创建存储过程时用双引号指定了大小写(如CREATE PROCEDURE "p_Qtd_ticket_dia"),调用时必须匹配大小写并使用双引号:"p_Qtd_ticket_dia"(l_Cod_loja, l_p_Data, l_p_Data);建议统一使用大写命名存储过程,避免此类问题。
验证参数匹配性
确认目标存储过程的参数数量、类型与调用时一致:- 检查
p_Qtd_ticket_dia是否定义为接受3个参数(NUMBER, DATE, DATE) - 检查
p_Qtd_ticket_mes是否定义为接受2个参数(NUMBER, NUMBER)
参数不匹配也可能导致Oracle无法识别存储过程。
- 检查
内容的提问来源于stack exchange,提问作者Arthur
相关产品推荐
相关产品推荐

