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

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;
      
  • 检查权限与用户架构
    如果目标存储过程属于其他用户:

    1. 调用时添加用户前缀,例如:
      other_schema.p_Qtd_ticket_dia(l_Cod_loja, l_p_Data, l_p_Data);
      
    2. 确保当前用户拥有执行权限:
      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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 17:55:13