2014-09-10 2 views
0

Поскольку я новичок в этом, я столкнулся с некоторой проблемой при выполнении хранимой процедуры в Oracle. Вот SP, который дает запись как выходной параметр, который имеет тип% rowtype и l_serno в качестве входного параметра, который имеет тип Number.Проблема с извлечением данных из SP (база данных Oracle)

Create OR Replace procedure get_product(l_serno in product.serno%type,record out product%rowtype) 
is 

begin 

select * into record from product where serno=l_serno; 

end get_product; 

Использование C#, я пытаюсь извлечь данные из SP и показать его на экране сетки.

OracleCommand cmd = new OracleCommand("get_product", Conn); 
       cmd.CommandType = CommandType.StoredProcedure; 
       Conn.Open(); 
       OracleParameter input = cmd.Parameters.Add("V_SERNO", OracleType.Number); 
       OracleParameter output = cmd.Parameters.Add("ITEMS_CURSOR", OracleType.Cursor); 
       input.Direction = ParameterDirection.Input; 
       output.Direction = ParameterDirection.ReturnValue; 
       input.Value = 2; 
       OracleDataReader rd = cmd.ExecuteReader(); 
       DataTable dt = new DataTable(); 
       dt.Load(rd); 
       GridView1.DataSource = dt; 
       GridView1.DataBind(); 
       Conn.Close(); 

Здесь я получаю сообщение об ошибке, как

ORA-06550: строка 1, столбец 24:

PLS-00306: неверное число или типы аргументов в вызове к 'GET_PRODUCT'

ORA-06550: строка 1, столбец 7:

Пожалуйста, дайте мне знать, что я здесь делаю. Спасибо заранее.

+0

Вместо 'ParameterDirection.ReturnValue;', вы пробовали 'ParameterDirection.Output;'? ; – Hassan

+0

Hi Hassan Nisar, Спасибо за ваш ответ. Я также попытался использовать параметр ParameterDirection.Output. По-прежнему получается такая же ошибка. – Pacchi

+0

Перекрестите «OracleType», который вы упомянули в параметрах. Также проверьте этот [ответ] (http://stackoverflow.com/questions/14247921/how-to-return-oracle-output-parameters-from-a-stored-procedure-in-net). – Hassan

ответ

1

Ваша процедура имеет эту подпись:

(l_serno in product.serno%type,record out product%rowtype) 

Но в коде C# вы указываете это:

OracleParameter output = cmd.Parameters.Add("ITEMS_CURSOR", OracleType.Cursor); 

Курсор представляет собой указатель на результирующий набор и отличается от переменной. Вы можете изменить свой код C#: определить класс, атрибуты которого соответствуют проекции таблицы PRODUCT. Кроме того, измените хранимую процедуру на использование курсора ref.

Второй подход, вероятно, меньше работы (не в последнюю очередь потому, что вы можете заставить нас сделать это для вас)

create or replace procedure get_product 
     (l_serno in product.serno%type, 
      record out sys_refcursor) 
is 
begin 
    open record for 
      select * from product 
      where serno=l_serno; 
end get_product; 
+0

Привет, APC, спасибо за ваш ответ. Как вам было предложено, я попытался изменить параметр хранимой процедуры на курсор. Я получал ту же ошибку. Затем я изменил «l_serno в product.serno% type» на «l_serno number», это сделало трюк и начало работать – Pacchi

Смежные вопросы