Один из способов сделать это:
List<Set<String>> tmp = new ArrayList<>();
tmp.add(new HashSet<>(List.of("A", "B", "C")));
tmp.add(new HashSet<>(List.of("B", "A", "C")));
tmp.add(new HashSet<>(List.of("C", "D", "E")));
tmp.add(new HashSet<>(List.of("E", "C", "D")));
Iterator<Set<String>> it = tmp.iterator();
while (it.hasNext())
{
Set<String> currentSet = it.next();
for (Set<String> set : tmp)
{
if (currentSet != set
&& currentSet.containsAll(set)
&& currentSet.size() == set.size())
{
it.remove();
break;
}
}
}
System.out.println(set);
Вывод:
[[A, B, C], [C, D, E]]
Вы не можете сделать этого с %ROWTYPE. %ROWTYPE является на самом деле МН типом записи / типом записи SQL, который не является легальным типом в SQL, таким образом, Вы не можете использовать его в ВЫБОРЕ. Необходимо создать тип объекта, который имеет те же столбцы как таблица, изменение для функционирования, чтобы ожидать, что тип объекта вместо %ROWTYPE, и затем можно записать что-то вроде этого:
SELECT function(table1_typ(column1, column2, column3))
FROM table1 t1
Недостатки: все еще необходимо ввести все столбцы в ВЫБОРЕ, и если Вы измените таблицу, то необходимо будет изменить тип объекта и ВЫБОР также.
Почему не только передают идентификатор строки в и делают функциональную работу над этим?
Править: Вы смогли создавать ОБЪЕКТ / ВВОДЯТ на лету и передача это к функции. Затем необходимо будет только запросить для данных однажды. Сообщите мне, нужен ли Вам пример.
Можно сделать это:
DECLARE
foo table1%ROWTYPE;
BEGIN
function1(foo);
END;
Править: Можно проверить это сообщение в блоге для более подробного описания того, как использовать эту технику.