ORA-06550:在ASP.NET中的oracle包中调用函数时,参数的错误数量或类型错误

shr*_*aal 1 c# asp.net oracle plsql

我在Oracle 10g数据库中的一个名为TEST的oracle包中有一个函数

FUNCTION GetEname(P_ename IN VARCHAR2) RETURN VARCHAR2 AS
retVal VARCHAR2(10);
BEGIN
retVal := SUBSTR(P_ename, 3, INSTR(P_ename, ':', 1, 2) - 3);

RETURN RetVal;

END GetEntDefIEIDFromEname;
Run Code Online (Sandbox Code Playgroud)

我创建了一个ASP.net页面,我在page_load中有以下代码:

String strResult = "";
        try
        {   
            oracleConn.ConnectionString = ConfigurationManager.ConnectionStrings["OracleDatabase"].ConnectionString;
            oracleConn.Open();
            OracleCommand orclCmnd = new OracleCommand();
            orclCmnd.Connection = oracleConn;
            orclCmnd.CommandText = "TEST.GetEname";
            orclCmnd.CommandType = CommandType.StoredProcedure;

            OracleParameter ename = new OracleParameter();
            ename.ParameterName = "ename";
            ename.OracleType = OracleType.VarChar;
            ename.Direction = ParameterDirection.Input;
            ename.Value = "0:490330";
            orclCmnd.Parameters.Add(ename);

            strResult = (String)orclCmnd.ExecuteOracleScalar();

            oracleConn.Close();
            oracleConn.Dispose();

            lbl1.Text = "Result of  " + strResult;
        }                
        catch (Exception ex)
        {
            Console.Out.WriteLine(ex.ToString());
            oracleConn.Close();
        }
Run Code Online (Sandbox Code Playgroud)

当我运行代码时,我收到以下错误消息:

"ORA-06550:第1行第7列:\nPLS-00306:调用'GETENAME'\nORA-06550时参数的数量或类型错误:第1行第7列:\nPL/SQL:忽略语句\n"} System.Exception {System.Data.OracleClient.OracleException}

D S*_*ley 6

您在代码中为参数使用了不同的名称.尝试改变

ename.ParameterName = "ename";
Run Code Online (Sandbox Code Playgroud)

ename.ParameterName = "P_ename";
Run Code Online (Sandbox Code Playgroud)

您需要为输出值添加参数:

OracleParameter result = new OracleParameter();
result.OracleType = OracleType.VarChar;
result.Direction = ParameterDirection.ReturnValue;
orclCmnd.Parameters.Add(result);
Run Code Online (Sandbox Code Playgroud)

在使用ExecuteNonQuery调用函数后从参数中获取值:

orclCmnd.ExecuteNonQuery();
strResult = result.Value.ToString();
Run Code Online (Sandbox Code Playgroud)