Intereting Posts

Oracle в C #, связывать переменные и запросы типа ID IN (1, 2, 3)

Я ищу адаптацию C # ODAC следующего метода Java, где код может связывать массив чисел (размер массива может меняться) в оператор SELECT не PL / SQL, а затем использовать результирующий массив в WHERE ID IN (...) .

http://rafudb.blogspot.com/2011/10/variable-inlist.html

Вот еще один пример этого метода, используемого в программах на основе OCI:

Oracle OCI, связывать переменные и запросы, такие как ID IN (1, 2, 3)

В частности, мы хотим выполнить запрос типа

 SELECT * FROM MyTable WHERE ID IN (SELECT * FROM TABLE(:1)) 

И перейдите в массив чисел в :1 .

Код:

 oraParam.UdtTypeName = "SYS.ODCINUMBERLIST"; VArray newArray = new VArray(); newArray.Array = new Int32[] {12,24,42}; oraParam.OracleDbType = OracleDbType.Array; oraParam.Value = newArray; string query = @"Select * from TABLE(:1) "; OracleCommand command = new OracleCommand(query, MyConnection); command.Parameters.Add(oraParam); OracleDataReader reader; var m_connection = new OracleConnection("The CONNECTION STRING"); m_connection.Open(); var reader = command.ExecuteReader(); reader.Close(); m_connection.Close(); 

За ними следуют следующие классы помощников:

 class VArray : IOracleCustomType, INullable { [OracleArrayMapping()] public Int32[] Array; private OracleUdtStatus[] m_statusArray; public OracleUdtStatus[] StatusArray { get { return this.m_statusArray; } set { this.m_statusArray = value; } } private bool m_bIsNull; public bool IsNull { get { return m_bIsNull; } } public static VArray Null { get { VArray obj = new VArray(); obj.m_bIsNull = true; return obj; } } public void ToCustomObject(OracleConnection con, IntPtr pUdt) { object objectStatusArray = null; Array = (Int32[])OracleUdt.GetValue(con, pUdt, 0, out objectStatusArray); m_statusArray = (OracleUdtStatus[])objectStatusArray; } public void FromCustomObject(OracleConnection con, IntPtr pUdt) { OracleUdt.SetValue(con, pUdt, 0, Array, m_statusArray); } public override string ToString() { if (m_bIsNull) return "VArray.Null"; else { string rtnstr = String.Empty; if (m_statusArray[0] == OracleUdtStatus.Null) rtnstr = "NULL"; else rtnstr = Array.GetValue(0).ToString(); for (int i = 1; i < m_statusArray.Length; i++) { if (m_statusArray[i] == OracleUdtStatus.Null) rtnstr += "," + "NULL"; else rtnstr += "," + Array.GetValue(i).ToString(); } return "VArray(" + rtnstr + ")"; } } } [OracleCustomTypeMapping("SYS.ODCINUMBERLIST")] public class VArrayFactory : IOracleCustomTypeFactory, IOracleArrayTypeFactory { // IOracleCustomTypeFactory public IOracleCustomType CreateObject() { return new VArray(); } // IOracleArrayTypeFactory Interface public Array CreateArray(int numElems) { return new Int32[numElems]; } public Array CreateStatusArray(int numElems) { // CreateStatusArray may return null if null status information // is not required. return new OracleUdtStatus[numElems]; } } 

ОПИСАНИЕ:

Общая идея заключается в том, что, подобно примеру OCI, вы должны указать этот параметр как SYS.ODCINUMBERLIST (или другой допустимый тип). Этот тип не задан по умолчанию в C # OracleDBType, поэтому вам нужно использовать имя UdtTypeName и настраиваемый Factory / Class для успешной привязки.

Это было вызвано следующим сообщением об определении пользовательских типов .

Ограничения:

Это точное решение будет работать только со значениями INT / NUMBER, потому что оно выгружается из типа таблицы SYS.ODCINUMBERLIST. Если это необходимо для других типов, вам может потребоваться найти / написать дополнительные пользовательские типы таблиц.