Я использую ODP.NET (переход от поставщика Microsoft), и я застрял в хранимой процедуре, которая возвращает refcursor. У меня есть следующие/процедура PL SQL (я изменил его немного, чтобы сделать его более общим):Проблема с Oracle RefCursor
PROCEDURE MyProc(parameter_no1 IN NUMBER, parameter_no2 IN NUMBER, RETCURSOR OUT ret_type) AS
BEGIN
OPEN RETCURSOR FOR
SELECT ad.logo logo
FROM tab_a a, tab_h h
WHERE a.id IS NOT NULL
AND a.h_id = h.id
AND a.no1 = parameter_no1
AND a.no2= parameter_no2;
END HanteraLogotype;
А потом у меня есть folloing C# код для вызова его:
internal void RefCursorDataReader()
{
OracleCommand cmd = new OracleCommand("ABC$MYPACKAGE.MyProc", new OracleConnection(_constr));
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection.Open();
cmd.BindByName = true;
OracleParameter p = cmd.Parameters.Add("parameter_no1", OracleDbType.Decimal);
p.Value = 12345678;
p.Direction = ParameterDirection.Input;
p = cmd.Parameters.Add("parameter_no2", OracleDbType.Decimal);
p.Value = 123456;
p.Direction = ParameterDirection.Input;
p = cmd.Parameters.Add("RETCURSOR", OracleDbType.RefCursor);
p.Direction = ParameterDirection.Output;
OracleDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
System.Diagnostics.Debug.WriteLine(reader[0].GetType().ToString());
}
cmd.Connection.Close();
}
И когда я запускаю это, я получаю это исключение:
ORA-03106: фатальная ошибка протокола связи двух задач
Я пробовал множество различных вариантов параметров, их тип, порядок и т. Д., Но ничего не помогает. Это исключение составляет reader.Read()
. Я бы очень признателен за помощь в этом!
Добавлено: ret_type определяется как:
ТИП ret_type IS REF CURSOR;
Тип логотипа LONG RAW , и это, кажется, проблема. Если я изменю его на число, он будет работать. – kaze
Ах, LONG типы данных были устаревшими в Oracle 8, я полагаю. LOB заменил их. –