Написать процедуру Oracle для принятия списка элементов, используемых в Select - PullRequest
2 голосов
/ 04 января 2011

Было несколько подсказок, которые, кажется, приблизили меня здесь, но с некоторыми уникальными проблемами, я надеюсь, что этот вопрос достаточно отличителен, чтобы заслуживать отдельной публикации.

Для начала вот чтоЯ имею.У меня есть процедура Oracle, которая возвращает стандарт REF CURSOR, и этот REF CURSOR передается обратно в мое приложение.REF CURSOR - это список идентификаторов поиска.

Затем я хочу взять этот список и перенести его в другое хранилище данных и использовать его в операторе выбора.Абсолютно возможно будет сделать это, просматривая REF CURSOR, но я надеюсь избежать этого.Я бы предпочел написать SELECT...WHERE lookup_id IN result_ref_cursor ИЛИ SELECT...WHERE EXISTS...

Во-первых, возможно ли это или я должен просто попробовать менее элегантное решение?Если это возможно, какие-нибудь подсказки относительно того, где я должен начать искать?

Я относительно новичок в Oracle, но в целом довольно опытный в RDBM, так что не стесняйтесь только через некоторые ссылки на меняможет учиться.Высоко ценится

Ответы [ 2 ]

1 голос
/ 05 января 2011

Почему kurosch не поместил свой ответ как "ответ", я понятия не имею.

Итак, вы делаете, определяете тип SQL, который описывает одну строку вывода курсора ref, а также тип SQL, который является таблицей предыдущего.Затем вы создадите конвейерную функцию, которая возвращает строки, возвращаемые курсором ref.Затем эту функцию можно использовать в стандартном SQL.Я заимствую у Спросите у Тома об этом.

create or replace type myLookupId as object ( id int)
/

create or replace type myLookupIdTable as table of myLookupId
/

create or replace function f return myLookupIdTable PIPELINED is
  l_data myLookupId;
  l_id number;
  p_cursor SYS_REFCURSOR;
begin
  p_cursor := function_returning_ref_cursor();
  loop
    fetch p_cursor into l_id;
    exit when p_cursor%notfound;
    l_data := myLookupId( l_id );
    pipe row (l_data);
  end loop;
 return;
end;
/

А теперь пример запроса ...

SELECT  * 
FROM    SOME_TABLE
WHERE   lookup_id in (SELECT ID FROM table(f));

Извините, если код несовершенно верно, у меня нет базы данных для тестирования прямо сейчас.

0 голосов
/ 05 января 2011

Есть несколько направлений, по которым вы могли бы пойти с этим, но я провел поиск конкретного решения, которое вы хотите, и кажется, что никто не делал это достаточно часто, чтобы появиться там. То, что вы можете сделать, это поискать металик оракула - который обычно действительно хорош при поиске неясных ответов. (Хотя вам действительно нужно соглашение об обслуживании - только что выяснилось, что срок действия шахты истек :()

Другие возможные решения:

Создайте связь между хранилищами данных, чтобы вы могли делать выбор непосредственно в plsql

Создайте в Java функцию, которая проходит по ней, чтобы вы могли создать строку для запроса. Это будет выглядеть немного более симпатично, по крайней мере.

В противном случае REF CURSOR нужно переходить назад и вперед - я не знаю, как можно передать результаты REF CURSOR в одном соединении на запрос в другом, не проходя через него.

...