Мы разворачиваем несколько проектов на C # с базами данных Oracle. Я хотел бы реализовать всю логику базы данных в хранимых процедурах Oracle, как это
- сохраняет всю логику базы данных в базе данных
- упрощает поддержку при изменении структуры базы данных
- упрощает повторное использование хранимых процедур в разных языках программирования
У меня запущен тестовый код, в котором я возвращаю строки, используя SYS_REFCURSOR, и я вручную связываю данные с результатами, поскольку SYS_REFCURSOR может возвращать что угодно - т. Е. Это не безопасный тип
У меня вопрос: есть ли способ определить правильные типы в типе возвращаемого значения хранимой процедуры и правильно привязать этот тип в моем коде C #?
например. моя процедура PL / SQL выглядит следующим образом - возвращаемая часть не является типобезопасной - это может быть что угодно. Если я захочу повторно использовать его из другого пакета Oracle, он не будет правильно проверять тип
PROCEDURE get_risk (p_process_id IN NUMBER, p_risk OUT sys_refcursor);
и мой код на C # выглядит примерно так: Я собрал это вместе из нескольких классов, так что, надеюсь, это имеет смысл. Когда я извлекаю данные из вызова БД, я вручную определяю типы данных - мне нужно знать в коде C #, что такое типы данных Oracle
// setup procedure call
_oracleCommand = new OracleCommand("risk_pkg.get_risk", _conn.OracleConnection);
_oracleCommand.Parameters.Add(new OracleParameter("p_process_id", OracleDbType.Int64, processId, ParameterDirection.Input));
_oracleCommand.Parameters.Add(new OracleParameter("p_risk", OracleDbType.RefCursor, null, ParameterDirection.Output));
_oracleDataAdapter = new OracleDataAdapter(_oracleCommand);
_dataSet = new DataSet();
// call Oracle
_oracleDataAdapter.Fill(_dataSet);
// extract data - hand coded binding
Int64 dbRiskId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["risk_id"]];
Int64 dbClientId = (Int64)_dataSet.Tables[0].Rows[0][_dataSet.Tables[0].Columns["client_id"]];
return new Risk(dbRiskId, dbClientId);
Это не обязательно проблема - я просто хочу знать, есть ли лучший способ сделать это, чтобы сделать мой PL / SQL более понятным в том, что он возвращает, и чтобы мой код на C # не знал Oracle типы данных - инкапсуляция меня от изменений структуры базы данных
Принятое решение: похоже, это практическое решение. Я все еще немного недоволен тем, что моя процедура Oracle не определяет явно тип возвращаемого значения, но что жизнь