Я знаю, что это старый вопрос, но один из нескольких, в котором выбранный ответ не решил мою проблему, и я не хочу начинать еще одну ветку по этой теме, поэтому я просто изложу то, что нашел в моих путешествиях в надежде, что это кому-нибудь поможет.
Я не очень много работаю с Oracle, но, как и в SQL Server, кажется, что для передачи табличного параметра необходим соответствующий UDT (пользовательская таблица), на который у вас есть разрешения EXECUTE (я мог бы быть неправильно). Это означает, что другие ответы, предполагающие использование встроенного SYS UDT, идут с некоторым грузом, и я не мог понять, действительно ли возможно передать таблицу чему-то, что не является хранимой процедурой PL / SQL в текущей версии ODP.net.
Во-вторых, решение для разбора строк является препятствием по всем очевидным причинам (невозможно кэшировать план выполнения или как его называет Oracle, плохо масштабируется и т. Д.).
Таким образом, я потратил довольно много времени, пытаясь выполнить предложение IN, используя табличный параметр в datamart, на который у меня есть только разрешение READ, прежде чем меня поразила ослепительная вспышка очевидного ( В Форум ASP.net не менее ). Оказывается, Oracle поддерживает Xml-запросы «изначально», поэтому вместо передачи массива значений вы можете передать список XML (если это все, что вам нужно). Опять же, я могу ошибаться, но он обрабатывается как допустимый параметр связывания, и это пример того, как его просто использовать (vb.net, ADO.net, ODP.net с использованием пакета NuGet):
Dim xe As New XElement("l", New XElement("i", "ITEM-A"), New XElement("i", "ITEM-B"))
Using conn As New OracleConnection(myConnectionString)
conn.Open()
Using cmd As OracleCommand = conn.CreateCommand()
cmd.CommandType = CommandType.Text
Dim query As String
query = " SELECT s.FOO, q.BAR " & vbCrLf
query &= " FROM TABLE1 s LEFT OUTER JOIN " & vbCrLf
query &= " TABLE2 q ON q.ID = s.ID " & vbCrLf
query &= " WHERE (COALESCE(q.ID, 'NULL') NOT LIKE '%OPTIONAL%') AND "
query &= " (s.ID IN ("
query &= " SELECT stid "
query &= " FROM XMLTable('/l/i' PASSING XMLTYPE(:stid) COLUMNS stid VARCHAR(32) PATH '.')"
query &= " )"
query &= " )"
cmd.CommandText = query
Dim parameter As OracleParameter = cmd.Parameters.Add("stid", OracleDbType.NVarchar2, 4000)
parameter.Value = xe.ToString
Using r As OracleDataReader = cmd.ExecuteReader
While r.Read()
//Do something
End While
End Using
End Using
conn.Close()
Это скорее наблюдение, чем тщательно изученное решение, поэтому, пожалуйста, прокомментируйте, если есть что-то неуместное в этом.
EDIT. При использовании этого метода, по-видимому, существует ограничение в 4000 символов (2000, если NVARCHAR), поэтому мне пришлось наблюдать за своей страницей. Информативное сообщение об ошибке, которое вы получите, если перейти, «ORA-01460: запрошено невыполненное или необоснованное преобразование» *