Процедура PLSQL, чтобы проверить, что значение содержится во вложенной таблице - PullRequest
0 голосов
/ 18 января 2019

У меня большая проблема, чтобы сделать простую проверку "содержит". Как в яве collection.contains (х). Я попробовал наши СУЩЕСТВУЮЩИЕ и ЧЛЕНА без успеха.

Вот моя процедура до сих пор

PROCEDURE merge_custom_fields(s1_cf IN custom_fields_table, s2_cf IN custom_fields_table, r_cf OUT custom_fields_table) AS
  BEGIN
      IF(s1_cf IS NOT NULL AND s1_cf .count>0) THEN
        FOR idx IN s1_cf .first..s1_cf .last
        LOOP
         //---> s1_cf(idx).field_id contains in s2_cf <----
            r_cf .extend;
            r_cf (r_cf .last) := s1_cf (idx);
          END IF;
        END LOOP;
      END IF;
    END IF;
  END merge_custom_fields;

Здесь дополнительная информация

create or replace TYPE custom_fields_table FORCE
IS
  TABLE OF custom_fields_struct ;

А вот и определение custom_fields_struct

create or replace TYPE custom_fields_struct FORCE
AS
OBJECT
(
 field_id VARCHAR2 (128 CHAR),
 field_value TIMESTAMP (3)) FINAL ;

Ответы [ 2 ]

0 голосов
/ 20 января 2019

может быть:

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
     r_cf := s1_cf MULTISET UNION s2_cf;
END merge_custom_fields;
/

Скриншот демо

0 голосов
/ 18 января 2019

Поскольку все, что вам нужно, это получить элементы с общим 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;
/

Демо

...