2013-11-07 2 views
1

Предположим, у меня есть функция, в которой мне нужно выполнить несколько действий, все из которых зависят от результатов одного запроса. Все, что я смог найти, указывает, что мне нужно определить временную таблицу вне процедуры, которую я НЕ ХОЧУ ДЕЛАТЬ.Временное хранение Oracle в рамках функции

Я хотел бы сделать что-то вроде следующего:

create or replace function f_example(
    a_input in number 
) 
return varchar2 is 
begin 
    create local temporary table tempIDs 
    ( 
    testID number(6, 0) 
    , testValue number(8,0) 
); 

    //select data from tableFoo that will be overwritten by a_input into tempIDs 

    //update data in tableFoo with a_input & store old data in another tableFoo field 

end f_example; 

Этот синтаксис не работает. Oracle не разрешает «создавать» внутри функции.

Я не программист базы данных. Я привык работать на C# и Java. В этом случае я сохраню свои значения в локальном массиве (или что-то еще), выходящем за пределы области действия при завершении метода. Есть ли законный способ сделать что-то подобное в Oracle SQL?

+0

PL/SQL имеет коллекции и массивы, как Java. –

+0

В соответствии с комментариями в примере кода вам вообще не требуется временное хранилище, просто выполните 'update tableFoo set a_field = a_input, another_field = a_field где ...' – ThinkJet

+0

Проблема, с которой я столкнулся (что в моем примере не достаточно ясно сообщается) заключается в том, что мне нужно иметь возможность ссылаться на старые значения ПОСЛЕ того, как я сделал обновление. – Travis

ответ

5

Вы можете определить тип записи PL/SQL и связанный тип таблицы. Затем вы можете отправить SELECT...BULK COLLECT, чтобы заполнить таблицу.

declare 
    type my_record_type is record (testId number, testvalue number); 
    type my_table_type is table of my_record_type index by binary_integer; 
    my_table my_table_type; 
begin 
    select x, y bulk collect into my_table from table_foo; 
end; 
+0

Кажется, что это может сработать, но как мне тогда ссылаться на данные в нем? Когда я пытаюсь выбрать из my_table после его заполнения, я получаю ошибку компилятора: ORA-00942, таблица или представление не существует. – Travis

+2

Вы не будете «выбирать» из my_table. Это действительно массив объектов, а не таблица. Соглашение об именах Oracle несколько вводит в заблуждение. Как бы вы ссылались на нее, это зависит от того, что вы хотите сделать, но вы можете «за» зайти в нее или выполнить операцию «FORALL». – eaolson

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