internal static ITranslaterType GetTranslater(ITyped dataType) { string dataTypeFull = String.Empty; if (OracleTypeTranslaters.Any(t => t.IsValid(dataType))) { dataTypeFull = OracleTypeTranslaters.First(t => t.IsValid(dataType)).DataTypeFull; } else { dataTypeFull = dataType.OrclType.BuildDataTypeFullName(dataType); switch (OrclUtil.NormalizeDataType(dataType)) // dynamically create custom type translaters for complex types { case Orcl.ASSOCIATITVE_ARRAY: OracleTypeTranslaters.Add(new TranslaterAssociativeArray(dataTypeFull, TypeTargetForOracleAssociativeArray, dataType)); break; case Orcl.REF_CURSOR: if (dataType.SubType == null) { OracleTypeTranslaters.Add(new TranslaterRefCursorUntyped(dataTypeFull, TypeTargetForOracleRefCursor, dataType)); } else { OracleTypeTranslaters.Add(new TranslaterRefCursorTyped(dataTypeFull, TypeTargetForOracleRefCursor, dataType)); } break; case Orcl.OBJECT: OracleTypeTranslaters.Add(new TranslaterObjectType(dataTypeFull)); break; case Orcl.RECORD: OracleTypeTranslaters.Add(new TranslaterRecordType(dataTypeFull)); break; case Orcl.ROWTYPE: OracleTypeTranslaters.Add(new TranslaterRowtype(dataTypeFull)); break; case Orcl.NESTED_TABLE: OracleTypeTranslaters.Add(new TranslaterNestedTable(dataTypeFull, TypeTargetForOracleAssociativeArray, dataType)); break; case Orcl.VARRAY: OracleTypeTranslaters.Add(new TranslaterVarray(dataTypeFull, TypeTargetForOracleAssociativeArray, dataType)); break; default: OracleTypeTranslaters.Add(new TranslaterNoneType(dataTypeFull)); break; } } return(OracleTypeTranslaters.First(t => t.DataTypeFull.Equals(dataTypeFull))); }
private bool HasArgumentOfRefCursorOfRowtype() { foreach (IArgument arg in Arguments) { if (Arguments.IndexOf(arg) == Arguments.Count - 1) { return(false); // reached end of arg list since ref cursor uses "2 args" } // check type of argument and its subsequent argument if (arg.DataType == Orcl.REF_CURSOR && OrclUtil.NormalizeDataType(arg.NextArgument) == Orcl.ROWTYPE) { return(true); } } return(false); }