如何从C#调用Oracle过程

时间:2017-01-19 16:47:26

标签: c# sql .net oracle plsqldeveloper

从C#代码,我试图从Oracle调用PACKAGE.PROCEDURE()。在这个简单的例子中,我应该从过程调用中获取一个值,但我得到的只是错误:

  

在调用' 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();

有人可以指出我做错了什么。然后在实际场景中,我想调用一个从自定义Type返回一组值的过程,例如:

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);
                }

1 个答案:

答案 0 :(得分:2)

我不认为你离这么远......试试这个:

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现在包含过程中的out参数。

我认为您的问题是您试图在存储过程中使用DbDataReaderDbDataReader用于查询。

另外,我使用了ODP.net - 可能会或可能没有为您的问题做出贡献,您使用的是Ole。