В старом коде у нас есть приведенный ниже код для выполнения процедуры хранения Oracle
Код: Выделить всё
Class.forName("oracle.jdbc.driver.OracleDriver");
connection = DriverManager.getConnection(dbUrl, dbUser, dbPassword);
String typeNameOut = "APPS.p_insert_esb_task";
String typeTableNameOut = "APPS.p_task_rec_out_type";
StructDescriptor structDescriptorOut = StructDescriptor.createDescriptor(typeNameOut.toUpperCase(), connection);
ResultSetMetaData rsMetaData = structDescriptorOut.getMetaData();
cs = connection.prepareCall("{call APPS.XXKR_PA_PROJ_TASK_ESB_PKG.proc_to_fet_tsk_data(?,?)}");
cs.registerOutParameter(1, Types.ARRAY, typeTableNameOut.toUpperCase());
cs.setObject(2, maxBatchSize, Types.NUMERIC);
cs.execute();
if (name == null) {
return request.createResponseBuilder(HttpStatus.BAD_REQUEST).body("Please pass a name on the query string or in the request body").build();
} else {
return request.createResponseBuilder(HttpStatus.OK).body("Hello, " + name).build();
}
Код: Выделить всё
string typeTableNameOut = "APPS.p_task_rec_out_type";
OracleParameter structDescriptorOut = new()
{
ParameterName = "structDescriptorOut",
UdtTypeName = typeNameOut.ToUpper(),
OracleDbType = OracleDbType.Object
};
OracleParameter arrayDescriptorOut = new()
{
ParameterName = "arrayDescriptorOut",
UdtTypeName = typeTableNameOut.ToUpper(),
OracleDbType = OracleDbType.Object,
Direction = ParameterDirection.Output
};
OracleParameter numericDescriptorIn = new()
{
ParameterName = "numericDescriptorIn",
OracleDbType = OracleDbType.Int16,
Direction = ParameterDirection.Output,
Value = maxBatchSize
};
cs = new(Constants.PA22ProjectTaskOracleSPName, connection)
{
CommandType = CommandType.StoredProcedure
};
cs.Parameters.Add(arrayDescriptorOut);
cs.Parameters.Add(numericDescriptorIn);
await cs.ExecuteNonQueryAsync();
Код: Выделить всё
public void ToCustomObject(OracleConnection con, object pUdt)
/* Элементы массива = (Array)pUdt;
Код: Выделить всё
for (int i = 0; i < elements.Length; i++)
{
// Get the i-th element (THIS is your actual object UDT)
object elemObj = elements.GetValue(i);
// Now fetch attributes FROM THE ELEMENT, not pUdt.
var v = OracleUdt.GetValue(con, elemObj, "PARENT_TASK_ID");
ParentTaskId = v == null || v == DBNull.Value ? (decimal?)null : (decimal)v;
}*/
var v = OracleUdt.GetValue(con, pUdt, "PARENT_TASK_ID");
ParentTaskId = v == null || v == DBNull.Value ? (decimal?)null : (decimal)v;
v = OracleUdt.GetValue(con, pUdt, "TASK_STRAT_DATE");
TaskStratDate = v == null || v == DBNull.Value ? (DateTime?)null : (DateTime)v;
v = OracleUdt.GetValue(con, pUdt, "CHARGABLE");
Chargable = v == null || v == DBNull.Value ? null : (string)v;
Во время отладки это pUdt появляется в Array.
Я потратил почти 3 дня, чтобы попробовать много классов отображения коллекции изменений, но безуспешно.
Буду признателен за любую помощь!
Подробнее здесь: https://stackoverflow.com/questions/798 ... from-oracl
Мобильная версия