Reputation: 2197
I have 2 collection variables var1 and var2 in my pl/sql function. For example, the data inside of them is:
var1 var2
X X
X
Y
How can I subtract with pl/sql these collections so the result of it will be like:
var1 - var2: var2 - var1
X empty
Y
My collection type definition is below:
create type MY_TYPE_OBJECT as (
id numeric(20,0),
string_val varchar(4000),
time timestamp)
create domain MY_TYPE_TABLE as MY_TYPE_OBJECT[];
my variables are of MY_TYPE_TABLE type.
Upvotes: 0
Views: 1702
Reputation: 4141
Assuming your collections are of the same data type, in PL/SQL you can do it extremely easily as
var1 multiset except var2
var2 multiset except var1
Example:
declare
var1 sys.ora_mining_varchar2_nt := sys.ora_mining_varchar2_nt('X','X','Y');
var2 sys.ora_mining_varchar2_nt := sys.ora_mining_varchar2_nt('X');
var1_minus_var2 sys.ora_mining_varchar2_nt;
var2_minus_var1 sys.ora_mining_varchar2_nt;
begin
dbms_output.put_line('var1 has '||var1.count()||' elements');
for i in nvl(var1.first(),1)..nvl(var1.last(),0) loop
dbms_output.put_line(' element '||i||' = '||var1(i));
end loop;
dbms_output.put_line('var2 has '||var2.count()||' elements');
for i in nvl(var2.first(),1)..nvl(var2.last(),0) loop
dbms_output.put_line(' element '||i||' = '||var2(i));
end loop;
var1_minus_var2 := var1 multiset except var2;
dbms_output.put_line('var1_minus_var2 has '||var1_minus_var2.count()||' elements');
for i in nvl(var1_minus_var2.first(),1)..nvl(var1_minus_var2.last(),0) loop
dbms_output.put_line(' element '||i||' = '||var1_minus_var2(i));
end loop;
var2_minus_var1 := var2 multiset except var1;
dbms_output.put_line('var2_minus_var1 has '||var2_minus_var1.count()||' elements');
for i in nvl(var2_minus_var1.first(),1)..nvl(var2_minus_var1.last(),0) loop
dbms_output.put_line(' element '||i||' = '||var2_minus_var1(i));
end loop;
end;
/
... yields the output of ...
var1 has 3 elements
element 1 = X
element 2 = X
element 3 = Y
var2 has 1 elements
element 1 = X
var1_minus_var2 has 2 elements
element 1 = X
element 2 = Y
var2_minus_var1 has 0 elements
Enjoy!
Upvotes: 1