2017-01-19 5 views
0

Из кода C# я пытаюсь вызвать PACKAGE.PROCEDURE() из Oracle. В этом простом примере я должен получить одно значение из вызова процедуры, но все это я получаю сообщение об ошибке:Как вызвать процедуру Oracle с C#

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

Может кто-нибудь указать, что я делаю неправильно. Тогда в реальном сценарии я хотел бы вызвать процедуру, которая возвращает набор значений из пользовательского типа, такие как:

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

    TYPE t_interfase_data IS TABLE OF r_interface_data; 

Как я могу подойти к этим. Благодаря!

UPDATE: В моем конкретном случае я закончил вверх делает следующий подход

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

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

UPDATE: Поэтому, если я укажу направление параметра OUT (см. Код ниже), тогда мой код компилируется; но я не получаю никаких данных ... 'myCMD.Parameters.Add (" xNum ", OleDbType.Numeric). Направление = ПараметрDirection.Output; ' Любые идеи? –

ответ

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 из процедуры.

Я думаю, что ваша проблема в том, что вы пытались использовать DbDataReader в хранимой процедуре. DbDataReader - для запросов.

Кроме того, я использовал ODP.net - это могло или не могло повлиять на вашу проблему, что вы использовали Ole.

+0

Спасибо за ваш ответ @Hambone. В моем конкретном случае я закончил использовать следующий подход ... см. Обновление –