如何从 C# 调用 Oracle 过程
How to call an Oracle Procedure from C#
从 C# 代码,我试图从 Oracle 调用 PACKAGE.PROCEDURE()。在这个简单的例子中,我应该从过程调用中得到一个值,但我得到的只是错误:
wrong number or types of arguments in call to 'RETURN_NUM'
程序声明如下:
PROCEDURE return_num(xNum OUT NUMBER) AS
BEGIN
xNum:= 50;
dbms_output.put_line('hello world ' || xNum);
END;
C#代码:
Oraclecon.Open();
OleDbCommand myCMD = new OleDbCommand("TEST.return_num", Oraclecon);
myCMD.CommandType = CommandType.StoredProcedure;
myCMD.Parameters.Add("xNum", OleDbType.Numeric);
OleDbDataReader myReader;
myReader = myCMD.ExecuteReader();
有人可以指出我做错了什么吗?然后在真实场景中,我想调用一个过程,该过程 returns 来自自定义类型的一组值,例如:
TYPE r_interface_data IS RECORD
(
object_id VARCHAR2(16),
obj_type VARCHAR2(32)
);
TYPE t_interfase_data IS TABLE OF r_interface_data;
我该如何处理。谢谢!
更新:在我的特殊情况下,我最终采用了以下方法
using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name"))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlManager sqlManager = new SqlManager();
return sqlManager.GetDataSet(cmd);
}
我不认为你离得那么远...试试这个:
OracleCommand cmd = new OracleCommand("return_num", Oraclecon);
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal,
ParameterDirection.Output));
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value;
double result = d.ToDouble();
result
现在包含过程中的输出参数。
我认为您的问题是您试图在存储过程中使用 DbDataReader
。 DbDataReader
用于查询。
此外,我使用了 ODP.net -- 这可能会或可能不会导致您的问题,因为您使用的是 Ole。
从 C# 代码,我试图从 Oracle 调用 PACKAGE.PROCEDURE()。在这个简单的例子中,我应该从过程调用中得到一个值,但我得到的只是错误:
wrong number or types of arguments in call to 'RETURN_NUM'
程序声明如下:
PROCEDURE return_num(xNum OUT NUMBER) AS
BEGIN
xNum:= 50;
dbms_output.put_line('hello world ' || xNum);
END;
C#代码:
Oraclecon.Open();
OleDbCommand myCMD = new OleDbCommand("TEST.return_num", Oraclecon);
myCMD.CommandType = CommandType.StoredProcedure;
myCMD.Parameters.Add("xNum", OleDbType.Numeric);
OleDbDataReader myReader;
myReader = myCMD.ExecuteReader();
有人可以指出我做错了什么吗?然后在真实场景中,我想调用一个过程,该过程 returns 来自自定义类型的一组值,例如:
TYPE r_interface_data IS RECORD
(
object_id VARCHAR2(16),
obj_type VARCHAR2(32)
);
TYPE t_interfase_data IS TABLE OF r_interface_data;
我该如何处理。谢谢!
更新:在我的特殊情况下,我最终采用了以下方法
using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name"))
{
cmd.CommandType = CommandType.StoredProcedure;
SqlManager sqlManager = new SqlManager();
return sqlManager.GetDataSet(cmd);
}
我不认为你离得那么远...试试这个:
OracleCommand cmd = new OracleCommand("return_num", Oraclecon);
cmd.Parameters.Add(new OracleParameter("xNum", OracleDbType.Decimal,
ParameterDirection.Output));
cmd.CommandType = CommandType.StoredProcedure;
cmd.ExecuteNonQuery();
OracleDecimal d = (OracleDecimal)cmd.Parameters[0].Value;
double result = d.ToDouble();
result
现在包含过程中的输出参数。
我认为您的问题是您试图在存储过程中使用 DbDataReader
。 DbDataReader
用于查询。
此外,我使用了 ODP.net -- 这可能会或可能不会导致您的问题,因为您使用的是 Ole。