Вы можете объединить обычную таблицу с таблицей памяти, которая заполнена списком значений.
Я не знаю, как это сделать с Java, но я знаю, как это сделать с C #. Я думаю, что нечто подобное должно быть возможно с Java.
Читайте здесь: http://forums.oracle.com/forums/thread.jspa?threadID=892457&tstart=375
Давайте использовать коллекцию пользовательских типов (UDT).
Сначала создайте таблицу с 1 миллионом строк:
create table employees (id number(10) not null primary key, name varchar2(100) );
insert into employees
select level l, 'MyName'||to_char(level)
from dual connect by level <= 1e6;
1000000 rows created
commit;
exec dbms_stats.gather_schema_stats(USER, cascade=>TRUE);
Нет, мы переходим к коду C #:
Давайте выберем сотрудников с идентификаторами 3 и 4.
Тип коллекции MDSYS.SDO_ELEM_INFO_ARRAY используется, потому что, если мы используем этот уже предопределенный тип Oracle, нам не нужно определять наш собственный тип Oracle. Вы можете заполнить коллекцию MDSYS.SDO_ELEM_INFO_ARRAY максимум 1048576 номерами.
using Oracle.DataAccess.Client;
using Oracle.DataAccess.Types;
[OracleCustomTypeMappingAttribute("MDSYS.SDO_ELEM_INFO_ARRAY")]
public class NumberArrayFactory : IOracleArrayTypeFactory
{
public Array CreateArray(int numElems)
{
return new Decimal[numElems];
}
public Array CreateStatusArray(int numElems)
{
return null;
}
}
private void Test()
{
OracleConnectionStringBuilder b = new OracleConnectionStringBuilder();
b.UserID = "sna";
b.Password = "sna";
b.DataSource = "ora11";
using (OracleConnection conn = new OracleConnection(b.ToString()))
{
conn.Open();
using (OracleCommand comm = conn.CreateCommand())
{
comm.CommandText =
@" select /*+ cardinality(tab 10) */ * " +
@" from employees, table(:1) tab " +
@" where employees.id = tab.column_value";
OracleParameter p = new OracleParameter();
p.OracleDbType = OracleDbType.Array;
p.Direction = ParameterDirection.Input;
p.UdtTypeName = "MDSYS.SDO_ELEM_INFO_ARRAY";
p.Value = new Decimal[] { 3, 4 };
comm.Parameters.Add(p);
int numPersons = 0;
using (OracleDataReader reader = comm.ExecuteReader())
{
while (reader.Read())
{
MessageBox.Show("Name " + reader[1].ToString());
numPersons++;
}
}
conn.Close();
}
}
}
Индекс на employee.id не используется, если не указывать подсказку / * + кардинальность (вкладка 10) * /. Этот индекс создается Oracle, поскольку id является столбцом первичного ключа.
Это означает, что вам не нужно заполнять временную таблицу. Список значений остается в оперативной памяти, и вы присоединяете свою таблицу сотрудников с этим списком значений в памяти таблица (: 1) вкладка .
(wateenmooiedag = ТТТ) * +1027 *