You don't need to save the results of querying the UDT; reference its attributes in the VALUES clause like in the ON clause.
create table t ( c1 int, c2 date );
create or replace type tp as
object ( c1 int, c2 date );
/
create or replace type tp_t as
table of tp;
/
declare
v tp_t := tp_t ( tp ( 1, sysdate ), tp ( 2, sysdate ) );
begin
merge into t
using ( select * from table ( v ) ) tp
on ( t.c1 = tp.c1 )
when not matched then
insert values ( tp.c1, tp.c2 );
end;
/
select * from t;
C1 C2
---------- --------------------
1 07-JAN-2025 18:41:50
2 07-JAN-2025 18:41:50
If this isn't what you're looking for then be more specific about what you're trying to achieve.