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
有没有办法实现像
这样的简单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