Как выбрать из одной dbms_sql.number_table в другую - PullRequest
0 голосов
/ 25 июня 2018

Я передаю список индексов (включая дубликаты) в функцию в виде dbms_sql.number_table и хотел бы выбрать из нее уникальные записи в другой dbms_sql.number_table.

Пока у меня есть что-то вроде этого:

function selectIndices(tlngIndexList in in dbms_sql.number_table) return number
is
  tlngUniqueIndices dbms_sql.number_table;
begin
  select distinct * from tlngIndexList into tlngUniqueIndices;
  --Etc

, хотя разработчик SQL выдает ошибку «ORA-00942: таблица или представление не существует», так что, похоже, это неправильный способ сделать это. Есть идеи? Заранее спасибо.

1 Ответ

0 голосов
/ 25 июня 2018

Синтаксис для заполнения коллекции из запроса SQL:

select x bulk collect into y from z;

В 12.2 (и, возможно, в 12.1, хотя и не проверено) работает следующее:

create or replace function selectIndices
    ( tlngIndexList in dbms_sql.number_table )
    return number
as
    tlngUniqueIndices dbms_sql.number_table;
begin
    select distinct column_value bulk collect into tlngUniqueIndices
    from table(tlngIndexList);

    return tlngUniqueIndices.count;
end selectIndices;

В более ранних версиях выможно попробовать использовать значения коллекции в качестве индексов второй коллекции для дедупликации:

create or replace function selectIndices
    ( tlngIndexList in dbms_sql.number_table )
    return number
as
    tlngUniqueIndices dbms_sql.number_table;
    i pls_integer := tlngIndexList.first;
begin 
    while i is not null loop
        tlngUniqueIndices(tlngIndexList(i)) := tlngIndexList(i);
        i := tlngIndexList.next(i);
    end loop;

    return tlngUniqueIndices.count;
end selectIndices;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...