ODP.NET 和 SELECT INTO 语句

ODP.NET and SELECT INTO statement

有没有办法实现像

这样的简单SELECT INTO语句
SELECT First_Name 
INTO :Name 
FROM Employees 
WHERE EMPLOYEE_ID = 2

使用 return 值参数 ("Name") 使用 ODP.NET?

这就是我尝试实现它的方式,但是 OracleCommand 引发了 1006 异常:"ORA-01006: bind variable does not exist"

    public void getEmployee(int employee_id)
    {
        string cmdQuery = @"SELECT First_Name, Email, Salary INTO :FirstName, :EmailAddress, :CurrentSalary FROM EMPLOYEES WHERE employee_id = :Employee_id";
        trans_r = conn_r.BeginTransaction();
        try
        {
            OracleCommand cmd = new OracleCommand(cmdQuery, conn_u);
            cmd.BindByName = true;

            //WHERE Parameters
            OracleParameter paramDepartment_Id = new OracleParameter("Employee_id", employee_id);
            paramDepartment_Id.Direction = ParameterDirection.Input;
            cmd.Parameters.Add(paramDepartment_Id);

            //INTO Parameters
            OracleParameter param_Name_out = new OracleParameter("FirstName", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
            cmd.Parameters.Add(param_Name_out);
            OracleParameter param_Email_out = new OracleParameter("EmailAddress", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
            cmd.Parameters.Add(param_Email_out);
            OracleParameter param_Salary_out = new OracleParameter("CurrentSalary", OracleDbType.Int32, ParameterDirection.ReturnValue);
            cmd.Parameters.Add(param_Salary_out);

            OracleDataAdapter da = new OracleDataAdapter(cmd);
            OracleCommandBuilder cb = new OracleCommandBuilder(da);

            cmd.ExecuteReader();

        }
        catch (OracleException ex)
        {
            throw ex;
        }
    }

任何时候 ODP.net 抛出参数未找到错误,通常意味着参数名称不匹配、参数数量不正确或参数格式不正确。参数必须是参数配置中的“:PARAM”,前缀为“:”

 public void getEmployee(int employee_id)
{
    string cmdQuery = @"SELECT First_Name, Email, Salary INTO :FirstName, :EmailAddress, :CurrentSalary FROM EMPLOYEES WHERE employee_id = :Employee_id";
    trans_r = conn_r.BeginTransaction();
    try
    {
        OracleCommand cmd = new OracleCommand(cmdQuery, conn_u);
        cmd.BindByName = true;

        //WHERE Parameters
        OracleParameter paramDepartment_Id = new OracleParameter(":Employee_id", employee_id);
        paramDepartment_Id.Direction = ParameterDirection.Input;
        cmd.Parameters.Add(paramDepartment_Id);

        //INTO Parameters
        OracleParameter param_Name_out = new OracleParameter(":FirstName", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
        cmd.Parameters.Add(param_Name_out);
        OracleParameter param_Email_out = new OracleParameter(":EmailAddress", OracleDbType.Varchar2, ParameterDirection.ReturnValue);
        cmd.Parameters.Add(param_Email_out);
        OracleParameter param_Salary_out = new OracleParameter(":CurrentSalary", OracleDbType.Int32, ParameterDirection.ReturnValue);
        cmd.Parameters.Add(param_Salary_out);

        OracleDataAdapter da = new OracleDataAdapter(cmd);
        OracleCommandBuilder cb = new OracleCommandBuilder(da);

        cmd.ExecuteReader();

    }
    catch (OracleException ex)
    {
        throw ex;
    }
}

"SELECT INTO" 实际上是 PL/SQL 语言的一部分,而不是 SQL。所以你需要使用匿名 PL/SQL 块(将其包装在 BEGIN 和 END 中)

示例代码: http://oradim.blogspot.com/2007/04/odpnet-tip-anonymous-plsql-and.html

此外,请尝试使用 ParameterDirection.Output 而不是 ParameterDirection.ReturnValue