2013-10-12 6 views
0

Может ли кто-нибудь помочь мне или предоставить мне образец кода, где мне нужно прокрутить коллекцию на основе условия. так же, как where clause в sql. Ваша помощь высоко ценится ....Объединение коллекций в oracle

Вот мой код:

create table MODEL1 
(
    model_id NUMBER , 
    model_seq NUMBER, 
    p_ind  VARCHAR2(1) 
); 

insert into model1 (MODEL_ID, MODEL_SEQ, P_IND) 
values (4, 103, 'U'); 

insert into model1 (MODEL_ID, MODEL_SEQ, P_IND) 
values (3, 102, 'P'); 

insert into model1 (MODEL_ID, MODEL_SEQ, P_IND) 
values (2, 101, 'U'); 

insert into model1 (MODEL_ID, MODEL_SEQ, P_IND) 
values (1, 100, 'P'); 

MODEL PROCEDURE...... 

procedure ( param1,param2)  (assume this procedure is being called from other procedure and collection has been populated already) 

TYPE l_tab is table of MODEL1%rowtype; 

begin 

loop through l_tab records where ltab.model_id=param1 and p_ind =p 

Join based on if else condition. 

if param2 is not null then 

    l_tab.model_seq=param2 and ltab.p_ind='P' 

if param2 is null then 
     l_tab.p_ind='P'   etc........... 
+0

Таблицы PL/SQL - это просто коллекции. Вы не можете запросить их. Я бы подумал, что вы можете сделать что-то подобное в прямом SQL. – OldProgrammer

ответ

0

Если вы можете гарантировать, что ваша коллекция плотно заселена, то вы можете просто (в Oracle 10 или 11g):

for idx in 1..my_collection.last LOOP 
    if my_collection(idx).model_id = param1 and my_collection(idx).p_ind = 'p' then 
       my_collection(idx).some_col = 'some new value'; -- you change the collection 
    end if; 
end loop; 
+1

Я думаю, вы пропустили '.COUNT' (или' .LAST') между 'my_collection' и' LOOP'. –

+0

Nice catch. Благодарю. – Nick

0

Ответ на вопрос «точно так же, как предложение where» - это «да» и «нет».

No: Вы просматриваете коллекцию, и вы используете инструкцию IF для проверки состояния.

Да: Но если вы действительно хотите использовать предложение where, вы можете сделать это с помощью конвейерных функций oracle. Хотя я думаю, что для ваших целей это немного перебор.

Вы бы закончить с чем-то вроде

select * from table(myfunction) where model_seq = param1 

Как это работает немного сложнее. Когда я использовал его в последний раз, я был вполне доволен этой ссылкой http://www.oracle-base.com/articles/misc/pipelined-table-functions.php

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