2015-05-29 2 views
0

Я довольно новичок в oracle и должен решить следующую проблему.Oracle Хранимые процедуры с использованием временных таблиц

внутри хранимой процедуры Я хочу вернуть 2 курсора, подобные этому.

PROCEDURE MyProcA() 
as 
begin 

open refcursorA FOR 
    select id, ..... FROM tableA where ..... long series of conditions 

open refcursorB FOR 
    select * FROM table b where b.id IN (select id FROM tableA where .....  long series of conditions) 

Вот как у меня есть хранимая процедура на данный момент, но мне не нравится повторение. Предложение where SQL в скобках во втором курсоре точно совпадает с первым курсором. Как загрузить его в таблицу temp или ассоциативный массив или что-то использовать в обоих курсорах.

Заранее спасибо

+0

Возможно, с общим выражением таблицы 'С СТЕ как (SELECT * FROM TABLENAME) SELECT * FROM КТР внутреннее соединение КТР B на A.id + 1 = B .ID) 'обратите внимание, как CTE ссылается дважды. (A & B) .. но без понимания контекста лучше, я не уверен, что это правильный ответ. Плюс, почему курсоры? – xQbert

+0

Сколько строк будет возвращено в первый запрос? Мы говорим о небольшом объеме данных, который имеет смысл хранить в коллекции в памяти? Не могли бы вы создать представление для первого запроса, который вы укажете при открытии обоих курсоров? –

+0

Если выбор из таблицы А не содержит параметров, почему бы не преобразовать это в представление? – Ben

ответ

0

Похоже, что вам нужно REF Cursor

Как объявить?

cursor cursor_name is ref cursor; 

Как использовать?

open cursor_name for your select query 
loop 
fetch cursor_name into some_variable; 
exit when cursor_name%notfound; 
do_something; 
end loop; 
close cursor_name; 

Так же переменная курсор будет указывать на другую область SQL динамически.

ИЛИ

Вы можете увидеть Cursor Expression

+0

Я рассмотрел множество вариаций этого. Это не так. Я не знаю, когда выходить. Я не знаю, что «что-то должно быть». Я не знаю, как использовать массив в качестве таблицы в состоянии IN (.....). Я просто хочу иметь общую таблицу/коллекцию/массив идентификаторов для использования следующим образом. SELECT * FROM TABLEA WHERE FK_ID IN (SELECT ID FROM MYTABLE/ARRAY/COLLECTION). Представление не очень подходит, так как этот идентификатор происходит внутри пакета SP, а длинный список условий - все входные параметры. – davidbtosh

Смежные вопросы