C# 使用OracleCommand执行pl/sql函数

C# 使用OracleCommand执行pl/sql函数,c#,oracle,ado.net,plsql,C#,Oracle,Ado.net,Plsql,我有这个pl/sql函数,它唯一做的事情就是验证用户是否存在于数据库中,如果用户存在,则返回“Y”,但如果用户不存在,则返回“N”,我想要的是得到我在c#中以pl/sql返回的值 我正在使用oracle 10g CREATE OR REPLACE FUNCTION KRIST.f_Login (userName IN VARCHAR2, password IN

我有这个pl/sql函数,它唯一做的事情就是验证用户是否存在于数据库中,如果用户存在,则返回“Y”,但如果用户不存在,则返回“N”,我想要的是得到我在c#中以pl/sql返回的值

我正在使用oracle 10g

            CREATE OR REPLACE FUNCTION KRIST.f_Login (userName IN VARCHAR2,
                                                        password IN VARCHAR2)
            RETURN VARCHAR2 
            IS
                CURSOR USERFINDER IS
                    SELECT IdEmpleado
                    FROM EMPLEADO
                    WHERE Usuario=userName
                    AND Clave=password;
                id number;
                returnVal VARCHAR2(1);
            BEGIN
                OPEN USERFINDER;
                FETCH USERFINDER INTO id; 
                IF(id IS NULL) THEN
                    returnVal:='Y';
                    RETURN returnVal;
                END IF;
                returnVal:='N';
                RETURN returnVal;
                CLOSE USERFINDER;
            END;
            /
如何执行此函数并在变量中获得结果。。。我有这些代码,但不工作

                OracleCommand cmd = new OracleCommand("krist.p_login",conn);
                cmd.CommandType = CommandType.StoredProcedure;  // use StoredProcedure with Functions as well
                OracleParameter returnVal = new OracleParameter("returnVal",null);
                OracleParameter p_one = new OracleParameter("userName","kristian");
                OracleParameter p_two = new OracleParameter("password", "kristian");
                returnVal.OracleType = OracleType.VarChar;
                returnVal.Size = 1;
                p_one.OracleType = OracleType.VarChar;
                p_two.OracleType = OracleType.VarChar;
                p_one.DbType = DbType.String;
                p_two.DbType = DbType.String;
                returnVal.DbType = DbType.String;
                returnVal.Direction = ParameterDirection.ReturnValue;
                p_one.Direction = ParameterDirection.Input;
                p_two.Direction = ParameterDirection.Input;
                cmd.Parameters.Add(p_one);
                cmd.Parameters.Add(p_two);
                cmd.Parameters.Add(returnVal);
                cmd.ExecuteNonQuery();
                String bval = Convert.ToString(returnVal.Value);
                return bval;

据我所知,如果您使用的是ODP.NET,那么首先需要提供retVal参数

ODP.NET有点问题,它没有用提供的参数名绑定参数,而是按参数顺序绑定参数

因此,只需将顺序更改为:

cmd.Parameters.Add(returnVal);
cmd.Parameters.Add(p_one);
cmd.Parameters.Add(p_two);
在我的资料中,我发现了我称之为“return”的return参数(不确定它是否计数):

哈哈,还有一件事。它永远不会到达最后一行-因为返回将终止执行。一旦你不再需要它,就把它关上

RETURN returnVal;
CLOSE USERFINDER; --<<-- won't close this cursor
返回值;

关闭用户查找器-- 以下代码适用于我。
注意:您的pl/sql代码称为函数KRIST.f#u Login,但您的c#称它为KRIST.p_Login
NB2:您的pl/sql代码使用了Varchar2,但您的c#使用了varchar
NB3:我正在使用Oracle.DataAccess.dll
NB4:我假设返回值缓冲区大小可以是1,但请尝试不同的大小。

using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

int RETURN_VALUE_BUFFER_SIZE = 32767; 
OracleCommand cmd = new OracleCommand();
try {
    cmd.Connection = conn;
    cmd.CommandText = "KRIST.f_Login";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("returnVal", OracleDbType.Varchar2, RETURN_VALUE_BUFFER_SIZE);  
    cmd.Parameters["returnVal"].Direction = ParameterDirection.ReturnValue;

    cmd.Parameters.Add("userName", OracleDbType.Varchar2);
    cmd.Parameters["userName"].Value = "kristian";

    cmd.Parameters.Add("password", OracleDbType.Varchar2);
    cmd.Parameters["password"].Value = "kristian";

    cmd.ExecuteNonQuery();
    string bval = cmd.Parameters["returnVal"].Value.ToString();
    return bval;
} catch (Exception e) {
    // deal with exception 
} finally {
    command.Dispose();
    connection.Close();
    connection.Dispose();
}

默认情况下,ODP.net按顺序绑定。可以使用以下方法修改此行为:
cmd.BindByName=true

请使用count(*)并查看返回的行数是否超过0行。计数会变得越来越容易。如果用户名不存在或密码错误,选择idempeado将抛出一个找不到数据的示例。SELECT count(*)返回0.ORA-06550:第1行,第18列:PLS-00306:调用“P_LOGIN”时参数的数目或类型错误ORA-06550:第1行,第7列:这是引发异常。PL/SQL中的函数称为F_LOGIN,而在.NET中,您正试图调用P_LOGIN!没有ok xD…但在我的一次尝试中,我尝试使用in、out变量执行一个过程,但没有成功,但应该是p_Login注意:返回值必须作为第一个参数添加。谢谢!你帮我节省了很多时间!
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;

int RETURN_VALUE_BUFFER_SIZE = 32767; 
OracleCommand cmd = new OracleCommand();
try {
    cmd.Connection = conn;
    cmd.CommandText = "KRIST.f_Login";
    cmd.CommandType = CommandType.StoredProcedure;

    cmd.Parameters.Add("returnVal", OracleDbType.Varchar2, RETURN_VALUE_BUFFER_SIZE);  
    cmd.Parameters["returnVal"].Direction = ParameterDirection.ReturnValue;

    cmd.Parameters.Add("userName", OracleDbType.Varchar2);
    cmd.Parameters["userName"].Value = "kristian";

    cmd.Parameters.Add("password", OracleDbType.Varchar2);
    cmd.Parameters["password"].Value = "kristian";

    cmd.ExecuteNonQuery();
    string bval = cmd.Parameters["returnVal"].Value.ToString();
    return bval;
} catch (Exception e) {
    // deal with exception 
} finally {
    command.Dispose();
    connection.Close();
    connection.Dispose();
}