Поскольку все, что вам нужно, это получить элементы с общим field_id
, вы можете использовать функцию TABLE
и соединения.
DECLARE
l_field_value TIMESTAMP := systimestamp;
s1_cf custom_fields_table := custom_fields_table(
custom_fields_struct(1,l_field_value),custom_fields_struct
(2,l_field_value) );
s2_cf custom_fields_table := custom_fields_table(
custom_fields_struct(2,l_field_value),custom_fields_struct
(3,l_field_value) );
r_cf custom_fields_table;
BEGIN
SELECT custom_fields_struct(s1.field_id,s1.field_value) --should convert it to object
BULK COLLECT INTO r_cf --load directly into your OUT collection
FROM TABLE ( s1_cf ) s1
JOIN TABLE ( s2_cf ) s2
ON s1.field_id = s2.field_id; -- This filters the common elements
for i in r_cf.first..r_cf.last
LOOP
dbms_output.put_line(r_cf(i).field_id||','||r_cf(i).field_value);
END LOOP;
END;
/
2,18-01-19 06:27:55.607 PM
PL/SQL procedure successfully completed.
Можно использовать
EXISTS
и MEMBER OF
, но я полагаю, что вы хотите сделать сравнение столбцов и столбцов, а не поэлементно. Итак, единственный другой вариант, о котором я могу подумать, это запустить цикл for для обеих коллекций и сравнить field_id
одного с другим, чтобы получить индекс поля. Но, учитывая ваши требования, вышеуказанный вариант должен быть достаточно хорошим.
Ваша процедура будет выглядеть так:
CREATE OR REPLACE PROCEDURE merge_custom_fields (
s1_cf IN custom_fields_table,
s2_cf IN custom_fields_table,
r_cf OUT custom_fields_table
)
AS
BEGIN
SELECT custom_fields_struct(s1.field_id,s1.field_value) BULK COLLECT
INTO r_cf
FROM TABLE ( s1_cf ) s1
JOIN TABLE ( s2_cf ) s2 ON s1.field_id = s2.field_id;
END merge_custom_fields;
/
Демо