ODP .NET Получение вывода SYSREFCURSOR.{"Неподдерживаемый тип данных столбца"} ошибка - PullRequest
2 голосов
/ 10 августа 2010

Я пытаюсь выполнить процедуру, которая возвращает хранимую процедуру.Моя версия Oracle DB - 9.2, а версия ODP .NET - 10.2.0.100

Мой код C # выглядит следующим образом.

OracleCommand od = new OracleCommand();
od.Connection = oc;
OracleParameter opBranchNo;
OracleParameter opSysRef;
od.CommandType = System.Data.CommandType.StoredProcedure;
od.CommandText = "pkg_fetchleaseinfo.proc_fetchleaseheader";

opBranchNo = new OracleParameter("IBRANCH_ID", OracleDbType.Varchar2, 3, "044");
opBranchNo.Direction = System.Data.ParameterDirection.Input;
od.Parameters.Add(opBranchNo);

opSysRef = new OracleParameter();
opSysRef.ParameterName = "REC_SET";
opSysRef.Direction = System.Data.ParameterDirection.Output;
opSysRef.OracleDbType = OracleDbType.RefCursor;
od.Parameters.Add(opSysRef);
od.Prepare();
od.ExecuteNonQuery();
Oracle.DataAccess.Types.OracleRefCursor sysref = 
    (Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value;
return sysref.GetDataReader();
//OracleDataReader dr1 = 
//((Oracle.DataAccess.Types.OracleRefCursor)opSysRef.Value).GetDataReader();
//return dr1;

Мой код процедуры Oracle выглядит следующим образом

PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2,
    rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor; 
BEGIN
   OPEN x_rec FOR SELECT getleaseheaderrows(ibranch_id) FROM dual;
   rec_set := x_rec;  
EXCEPTION WHEN OTHERS THEN     
   RAISE; 
END;

Когда я выполняю свой код, часть, где я пытаюсь выполнить GetReader (), завершается с сообщением об ошибке UNSUPPORTED COLUMN DATATYPE.

1 Ответ

1 голос
/ 10 августа 2010

Я полагаю, вы открываете refCursor для удержания Select [RefCursor] из двойного

почему бы тебе не просто

PROCEDURE proc_fetchleaseheader(ibranch_id IN VARCHAR2,
    rec_set OUT SYS_REFCURSOR) IS x_rec genericCursor; 
BEGIN
   x_rec := getleaseheaderrows(ibranch_id);
   rec_set := x_rec;  
/**EXCEPTION WHEN OTHERS THEN     --no need for this, the proc will raise just fine without being explicitly told to do so
   RAISE; 
***/
END;

или, что еще лучше, просто вызовите getleaseheaderrows со стороны .net и отбросьте процедуру (просто запомните для параметров в ODP: всегда ожидает возвращаемое значение функции в качестве первого параметра.

...