MVC C# - 调用存储过程时出现 Oracle 异常

问题描述 投票:0回答:1

以前我使用的是 VS2012 并在我的控制器中运行这段代码效果很好,但是在迁移到 VS2019 之后,我在调用我的 SP 时遇到以下错误。 如果我直接从 PLSQL 运行它,它可以正常工作,没有任何错误,但是当从控制器调用它时,它会在 Entities Db Context 中显示以下问题。

    public virtual ObjectResult<Employee> GETEMP(string sEMPNO)
    {
        var sEMPNOParameter = sEMPNO != null ?
            new ObjectParameter("SEMPNO", sEMPNO) :
            new ObjectParameter("SEMPNO", typeof(string));

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Employee>("GETEMP",sEMPNOParameter);
    }

OracleException: ORA-06550: 第 1 行,第 8 列:PLS-00306: 错误的数字 或调用“CSR_GETEMP”时的参数类型 ORA-06550:第 1 行, 第 8 列:PL/SQL:语句被忽略

这是控制器动作

    public JsonResult GetUserInfo(string sEmpno)
    {
        var modeldata = db.GETEMP(sEmpno);
        
        return new JsonResult { Data = modeldata, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
    }   

存储过程代码

CREATE OR REPLACE PROCEDURE CSR_GETEMP(sEmpno in varchar2,
                                       cCurRef out sys_refcursor) is      
    Begin
      open cCurRef for
        select e.emp_no as empno,
               e.emp_name || ' ' || e.emp_last_name as empName,
               decode(e.email,'[email protected]','ND',nvl(e.email, 'ND')) as email,
               nvl(e.department_cd, 'ND') as dept_cd,
               nvl(e.org_name, 'ND') as team,
               nvl(e.mgr_email, 'ND') as mgr_email
          from vi_all_emps e
         where ((e.emp_no = upper(sEmpno)) or
               (upper(e.email) = upper(sEmpno) || '@OUTLOOK.COM'))
           and (status = 'W' or
               nvl(e.retired_date, sysdate + 1) >= trunc(sysdate));
    End;

有什么办法可以解决这个问题吗?

c# oracle model-view-controller visual-studio-2019
1个回答
0
投票

根据您提供的错误消息,我最初的猜测是您的控制器向存储过程传递的参数数量或类型与存储过程预期的不匹配。

以下是您可以尝试解决问题的一些方法:

1。检查参数名称和数据类型

确保传递给存储过程的参数名称和数据类型与存储过程中定义的相匹配。

2。检查参数方向

确保参数方向在C#代码中设置正确。

3。检查存储过程名称

确保您从 C# 代码中调用的存储过程名称与 Oracle 数据库中定义的名称相匹配。可能您还有其他考虑因素,但在您的情况下,存储过程名为 CSR_GETEMP,但您的 C# 代码正在调用名为 GETEMP 的存储过程。

4。检查架构名称

确保在存储过程调用中正确指定了架构名称。如果存储过程是在默认模式以外的模式中定义的,则需要在存储过程调用中指定模式名称。

如果它不起作用,请告诉我。

© www.soinside.com 2019 - 2024. All rights reserved.