简体   繁体   中英

How to call an Oracle Procedure from C#

From C# Code, I'm trying to call a PACKAGE.PROCEDURE() from Oracle. In this simple example I should get one value from the procedure call, but all I get is error:

wrong number or types of arguments in call to 'RETURN_NUM'

The procedure is declared as follows:

PROCEDURE return_num(xNum OUT NUMBER) AS
  BEGIN
    xNum:= 50;
    dbms_output.put_line('hello world ' || xNum);
  END;

C# code:

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

Can some one please point out what I'm doing wrong. Then in a real scenario I would like to call a procedure that returns a set of values from a custom Type, such as:

TYPE r_interface_data IS RECORD
    (
     object_id             VARCHAR2(16),     
     obj_type              VARCHAR2(32)
    );

    TYPE t_interfase_data IS TABLE OF r_interface_data;

How can I approach that. Thanks!

UPDATE: In my particular case I ended-up doing the following approach

using (OleDbCommand cmd = new OleDbCommand("PACKAGE.procedure_name"))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    SqlManager sqlManager = new SqlManager();
                    return sqlManager.GetDataSet(cmd);
                }

I don't think you're that far off... try this:

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 now contains the out parameter from the procedure.

I think your problem is you were attempting to use a DbDataReader on a stored procedure. DbDataReader is for queries.

Also, I used ODP.net -- that may or may not have contributed to your issue, that you were using Ole.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM