ARTICLE AD BOX
We currently have a migration phase from native monolithic to Azure cloud iPaaS.
We have this code to execute an Oracle stored procedure:
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(); }Now in C#, I wrote similar code shown here:
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();While running, I learned that we have to write a custom mapping class:
public void ToCustomObject(OracleConnection con, object pUdt) { /* Array elements = (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; }But nothing works. while debugging I get
System.InvalidCastException: Unable to cast object of type 'OracleInternal.UDT.Types.UDTPickleCollectionInst' to type 'System.Array'
Any help would be appreciated.
